发短信算法题

发短信:手机短信通常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);
	}

}
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值