剑指offer面试题12-打印1到最大的n位数

题目:

输入一个数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3最大的三位数即999


这道题的主要陷阱就在大数的处理,只要将这个考虑进去,用字符串来表示,就好说了。


那差不多代码是这样子的:

public void print1(int n) {
		if (n < 0) {
			throw new RuntimeException();
		}
		char[] number = new char[n];
		// 初始化所有的数都为'0'
		initNumber(number);
		// 如果没有达到'99..',并且递增
		while (increaseNumber(number)) {
			// 打印
			printNumber(number);
		}

	}


1.怎么初始化呢?

这个简单:

private void initNumber(char[] number) {
		for (int i = 0; i < number.length; i++) {
			number[i] = '0';
		}
	}

2.怎么打印?
到时候肯定有很多00011这样0开头的数字

如果0开头就不打印0,到了不是0开头的,就打印后面的

private void printNumber(char[] number) {
		boolean flag = false;
		for (int i = 0; i < number.length; i++) {
			if (number[i] != '0') {
				flag = true;
			}
			if (number[i] != '0' || flag) {
				System.out.print(number[i]);
			}
		}
		System.out.println();
	}

3.怎么递增,并且当增到某个999的时候返回false,其实时候返回true?

3.1先是如何递增:

那就模拟数字的递增:给最后位上加一,如果大于9了,就再往上一位加1,一直往上。

3.2如何返回true。false

接着递增的说,比如一个长度n=3的数,最后一位加1,大于9了前一位再加一。

也就只有当999加1的时候,遍历从i=0到i<3最后结果还是大于9的,所以就可以根据这个来确定返回值。

private boolean increaseNumber(char[] number) {
		for (int i = number.length - 1; i >= 0; i--) {
			number[i] = (char) (number[i] + 1);
			if (number[i] > '9') {
				number[i] = (char) (number[i] - 10);
			} else {
				return true;
			}
		}
		return false;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值