剑指offer-打印从 1 到最大的 n 位数

题目
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。
输入: 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不要打印出来

上图是简单的基本思路,边看代码边看图,有助于理解代码,完整代码如下
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) {