题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。
代码语言:javascript复制输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
解题思路(一)
- 找到最大数number的值,计算公10的n次方-1;
- 直接遍历循环number;
private void printMaxNumer(int n){
int maxValue =(int) Math.pow(10, n) - 1;
for (int i = 1; i <= maxValue; i ) {
System.out.print(i);
System.out.println();
}
}
这种方式虽然很简单,但是他没有办法处理数值大的数,比如n>10之后,int就会溢出。
解题思路(二)
基于上面思路,这次可以使用字符串形式打印从1到最大n位数
- 我们发现n位数的每一位数其实就是0~9的全排列
- 递归条件就是我迭代到最低位就是个位,这个时候就应该输出数字
- 如果我们未满n位的数字前面补0,在打印的时候,前面的0不要打印出来
上图是简单的基本思路,边看代码边看图,有助于理解代码,完整代码如下
代码语言:javascript复制public class Soultion {
public void printToMaxofNDigits(int n){
if(n<=0){
return;
}
char[] number = new char[n];
printToMaxofNDigits(number,0);
}
private void printToMaxofNDigits(char[] number, int digit) {
//终止条件
if (digit == number.length) {
printNumer(number);
return;
}
//循环每一位数中可能的数字[0-9]
for (int i = 0; i < 10; i ) {
//此时digit=0即百位,number[0]=0
number[digit] = (char) (i '0');
//进入下一层是个位,因此 digit要 1
printToMaxofNDigits(number, digit 1);
}
}
//这里主要的打印以及防止打印出前面的0,如[0,0,1] ,打印1就行
private void printNumer(char[] number) {
int index = 0;
while (index < number.length && number[index] == '0') {
index ;
}
while (index < number.length) {
System.out.print(number[index ]);
}
System.out.println();
}
}