剑指Offer题解

打印从1到最大的n位数

2018-07-17  本文已影响27人  lvlvforever

输入数字n,按照顺序打印从1到最大的n位十进制数。比如n=3,则打印1到999

最容易想到的是根据n求出最大的值是多少,然后使用一个for循环即可打印出所有数字,不过如果n很大的话,会造成溢出,这道题的考点就在大数问题。
大数可以使用字符串去表示,突破固有类型的限制,从而可以解决大数问题。

第一种

使用字符来模拟数字的加法。

 public void Print1ToMaxOfNDigits(int n) {
        if(n < 1){
            return;
        }
        char[] number = new char[n];
        for (int i = 0; i < number.length; i++) {
            number[i] = '0';
        }
        int count = 0;
        while(incrementNumber(number,n)){
            printNumber(number);
            count++;
        }
        System.err.println("count = " + count);
    }

    private void printNumber(char[] num) {
        StringBuilder sb = new StringBuilder();
        boolean flag = false;
        for(int i = 0 ; i < num.length; i++) {
            if(flag == true){
                sb.append(num[i]);
            }else if(num[i] != '0'){
                sb.append(num[i]);
                flag = true;
            }
        }
        System.err.println(sb);
    }
    private  boolean incrementNumber(char[] number,int n ) {
        int cur = n-1;
        while (cur >= 0) {
            char num = number[cur];
            if( num < '9'){
                number[cur] = (char)(num + 1);
                return true;
            }else if(num == '9'){
                number[cur] = '0';
                cur--;
            }
        }
        return false;
    }
   
第二种

打印数字相当于一个排列组合的问题,将所有组合按照顺序列出来即可。这种递归思路需要好好思考理解。

public void Print1ToMaxOfNDigits(int n) {
        if (n < 1) {
            return;
        }
        char[] number = new char[n];
        for (int i = 0; i < number.length; i++) {
            number[i] = '0';
        }
        for (int i = 0; i < 10; i++) {
            number[0] = Character.forDigit(i, 10);
            recur(number, 0);
        }
    }
    private void recur(char[] num, int index) {
        if (index == num.length - 1) {
            printNumber(num);
            return;
        }
        for (int i = 0; i < 10; i++) {
            num[index + 1] = Character.forDigit(i, 10);
            recur(num, index + 1);
        }
    }
  //前导0不做处理 便于看结果
    private void printNumber(char[] num) {
        System.err.println(num);
    }

上一篇 下一篇

猜你喜欢

热点阅读