`

发短信算法题

阅读更多

发短信:手机短信通常a个字就分一页,分页之前在短信之前都要加上(1/n)、(2/n)...,当然啦,这个要加到每页的字数里面。短信放送之前,头部加上“您好:”,结尾要加上“【AB公司】”,这些也当然要加入字数里面,现在请写一方法来显示每条短信的内容。程序的难点在于怎样获取总页数,而且要判断在什么情况下是不能显示所有的信息内容的

 

package com.fun;

import java.util.Scanner;

public class MessagePaging {
	private static final int MaxWordsOnePage = 10;
	private static final String prefix = "您好:";
	private static final String suffix = "【AB公司】";
	private String pageBaseStr = "(%d/%d)";
	final int baseLen = 3; // ( / ), the three character

	public static void main(String[] args) {
		MessagePaging paging = new MessagePaging();
		paging.run();
	}

	private void run() {
		System.out.println("please input message:");
		Scanner scanner = new Scanner(System.in);
		String content;
		while ((content = scanner.nextLine()).length() != 0) {
			String result = parseMessage(content);
			System.out.println("result: " + result);
			for(int i = 0; i < result.length(); i+=MaxWordsOnePage){
				int max = (i+MaxWordsOnePage) >= result.length() ? (result.length()) : (i + MaxWordsOnePage);
				String str = result.substring(i, max);
				System.out.println(i + ":" + str + ",len:" + str.length());
			}
		}
		System.out.println("finish");
	}

	public String parseMessage(String content) {
		StringBuffer sb = new StringBuffer(content);
		insertPrefix(sb);
		appendSuffix(sb);
		if (!hasNextPage(sb)) {
			return sb.toString();
		}
		int page = 1;
		int totalPage = getTotalPage(sb.length());
		checkInvalidTotalPage(totalPage,sb.length());
		while (page <= totalPage) {
			 insertPageMessage(sb, page, totalPage); //String pageContent =
//			 System.out.println(pageContent);
			++page;
		}
		return sb.toString();
	}

	private void checkInvalidTotalPage(int totalPage, int contentLength) {
		if (totalPage < 2) {
			System.out.println("totalPage " + totalPage + " less than 2");
			System.exit(0);
		}
		String pageMes = String.format(pageBaseStr, totalPage, totalPage);
		if (pageMes.length() >= MaxWordsOnePage) {
			System.out.println("page message:" + pageMes
					+ " is no longer than max words in one page len:"
					+ MaxWordsOnePage);
			System.exit(0);
		}
	}

	private int getTotalPage(final int contentLength) {
		int total = calculateMinTotal(contentLength);
		while (calculateTotal(contentLength, total) != total) {
			++total;
			checkInvalidTotalPage(total,contentLength);
		}
		return total;
	}
	
	private int calculateMinTotal(int contentLength){
		int tmpTotalPage = contentLength / MaxWordsOnePage + 1;
		int lowLen = baseLen + 2 * getDigits(tmpTotalPage);
		return (contentLength + tmpTotalPage*lowLen)/MaxWordsOnePage;
	}

	private int calculateTotal(int contentLength, int total) {
		int totalLength = contentLength + getTotalPageLen(total);
		int addOne = ((totalLength % MaxWordsOnePage) == 0 ? 0 : 1);
		return totalLength / MaxWordsOnePage + addOne;
	}

	private int getTotalPageLen(int total) {
		int lowLen = baseLen + 1 + getDigits(total);
		int highLen = baseLen + 2 * getDigits(total);
		int sumLen = 0;
		for (int i = 1; lowLen <= highLen; ++i) {
			sumLen += lowLen * getLenCount(total, i);
			++lowLen;
		}
		return sumLen;
	}

	private int getLenCount(int total, int i) {
		int low = (int) Math.pow(10, i - 1);
		int high = (int) Math.pow(10, i) - 1;
		if (total >= low && total <= high) {
			return total - low + 1;
		}
		return 9 * low;
	}

	// 获取数字的位数
	private int getDigits(int total) {
		int count = 0;
		while (total != 0) {
			total /= 10;
			count++;
		}
		return count;
	}

	private String insertPageMessage(StringBuffer sb, int page, int totalPage) {
		String pageMes = String.format(pageBaseStr, page, totalPage);
		sb.insert((page - 1) * MaxWordsOnePage, pageMes);
		int max = page * MaxWordsOnePage >= sb.length() ? sb.length()
				: (page * MaxWordsOnePage);
		return sb.substring((page - 1) * MaxWordsOnePage, max);
	}

	private boolean hasNextPage(StringBuffer sb) {
		return sb.length() > MaxWordsOnePage;
	}

	private StringBuffer insertPrefix(StringBuffer content) {
		return content.insert(0, prefix);
	}

	private StringBuffer appendSuffix(StringBuffer content) {
		return content.append(suffix);
	}

}
 

 

 

分享到:
评论

相关推荐

    吉利汽车Java笔试面试题.zip_面试资料下载

    - 垃圾回收机制:GC算法,新生代和老年代,可达性分析。 - 对象的生命周期:创建、使用、可达性分析、垃圾回收。 6. **IO流**: - 流的概念:输入流和输出流,字节流和字符流。 - 文件操作:File类,文件的读写...

    1.12编程基础之函数与过程抽象(10题)--题目 有链接.pdf

    ### 知识点:编程基础之函数与过程抽象 #### 标题和描述解析 标题指出了文档内容是关于...通过这些练习题,编程学习者可以加强对函数与过程抽象概念的理解和应用,为进一步深入学习复杂编程问题和算法打下坚实的基础。

    中国移动 校园招聘 计算机专业 通信专业 笔试题库

    本资源提供了中国移动校园招聘计算机专业通信专业笔试题库,涵盖了移动智能网系统、SCP、SMP、SMAP、VC 等概念,包括填空题、选择题、简答题等多种题型。本资源对移动智能网系统的知识点进行了详细的解释和描述,为...

    C语言编程题.2222C语言编程题.pdf

    【C语言编程题】主要涉及了C语言的基本编程技巧和数据结构的应用,下面将详细解析题目中的三个问题。 1. **短信计费用**: 这道题目是关于计算短信费用的问题。每条短信的费用是0.1元,但每条短信的内容不能超过70...

    SHW2树应用类讨论题1

    【SHW2树应用类讨论题1】主要探讨了如何高效地解决大数据量下的短信查重问题,这里涉及到了散列(哈希)方法、哈夫曼树编码以及字典树(Trie树)等数据结构和算法。下面将详细阐述这些知识点。 1. 散列(Hash)法:...

    中国移动2018年校园招聘考试笔试题库讲义复习资料赠送历年真题

    4. **数据结构与算法**:笔试中通常会有编程相关的题目,考生需要熟练掌握常见数据结构(如链表、树、图、队列、栈)和算法(排序、搜索、递归等),并能灵活应用解决实际问题。 5. **计算机基础**:包括计算机硬件...

    C语言编程题.pdf

    【C语言编程题.pdf】 本文件包含三个C语言编程题目,分别是短信计费问题、集体照问题和跳格问题。 1. **短信计费问题**: 这个问题是关于计算用户发送短信的总费用。如果一条短信超过70个字符,大多数手机会将其...

    江西梳城中学2014_2015学年高二数学下学期期中试题文课改实验班

    11. **独立事件概率**:第十一题,两条短信在5秒内进入手机,如果时间差小于2秒则手机受到干扰,计算这个概率。 12. **抛物线性质**:第十二题涉及抛物线上的两点与中点到准线的距离,利用抛物线的性质求解最大值。...

    Java高级面试题汇总及答案(2023年Java面试题及答案大全)

    Java高级面试题汇总及答案 以下是 Java 高级面试题汇总及答案的相关知识点: ...1. 使用外观模式来隐藏系统的复杂性,例如创建阿里短信接口、邮件接口、微信推送接口,并使用外观模式来隐藏实际的系统的复杂性。

    阿郎2008年部分笔试题

    2. SMS短信的原理:SMS(Short Message Service)短信基于GSM网络,通过短信服务中心(SMSC)进行存储转发,将文本信息从发送方移动终端传输到接收方移动终端。 3. repeater、bridge、router的区别: - Repeater...

    769634626691909课后习题答案.zip

    如果这个课后习题答案.zip文件与某个特定的课程或教材相关,那么可能涉及的IT知识点会更加具体,例如编程语言的练习题、网络原理问题、数据库查询等等。但鉴于当前提供的信息有限,无法给出更详细的解答。如果你能...

    深圳杯2012夏令营竞赛题

    【深圳杯2012夏令营竞赛题】是一系列挑战性的编程竞赛题目,旨在锻炼参赛者在IT领域的算法设计和问题解决能力。这些题目涵盖了数据处理、数据分析以及信息技术的创新应用,对于提升IT专业人士的技术素养具有极大的...

    Android面试题及答案

    包括指针的移动、排序算法、链表、二叉树的遍历或图的遍历等。 此外,Android面试题还包括 Android 手机操作系统的四层架构、Android dvm 的进程和 Linux 的进程、SIM 卡的 EF 文件、一条最长的短信息、Android 中...

    离散数学及其应用第八版偶数题答案

    此外,"Abbysent少于101条短信"(存在一天最多发送100条短信的命题)需要正确理解否定和量词的关系。121是11的平方,所以它不是完全平方数。 再比如,命题的真假判断,像 "288大于256且288大于128"(真命题)、"Ch...

Global site tag (gtag.js) - Google Analytics