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

2021-10-14 16:52:43 浏览数 (1)

题目

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

代码语言:javascript复制
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

解题思路(一)

  1. 找到最大数number的值,计算公10的n次方-1;
  2. 直接遍历循环number;
代码语言:javascript复制
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位数

  1. 我们发现n位数的每一位数其实就是0~9的全排列
  2. 递归条件就是我迭代到最低位就是个位,这个时候就应该输出数字
  3. 如果我们未满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();
    }
}

0 人点赞