美文网首页剑指Offer题解
打印从1到最大的n位数

打印从1到最大的n位数

作者: lvlvforever | 来源:发表于2018-07-17 22:45 被阅读27次

输入数字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);
    }

相关文章

  • LeetCode 每日一题 [50] 打印从1到最大的n位数

    LeetCode 打印从1到最大的n位数 [简单] 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比...

  • LeetCode题解之打印从1到最大的n位数

    打印从1到最大的n位数 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印...

  • 面试题17. 打印从1到最大的n位数

    打印从1到最大的n位数 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印...

  • JZ-068-打印从 1 到最大的 n 位数

    打印从 1 到最大的 n 位数 题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3...

  • 打印从1到最大的n位数

    《剑指offer》面试题17:打印从1到最大的n位数 题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如...

  • 打印从1到n最大n位数

    给定一个数字N,打印从1到最大的N位数。 输入 每个输入文件仅包含一组测试样例。 对于每个测试案例,输入一个数字N...

  • 打印从1到最大的n位数

    输入数字n,按照顺序打印从1到最大的n位十进制数。比如n=3,则打印1到999 最容易想到的是根据n求出最大的值是...

  • 打印从1到最大的n位数

    题目: 题目的理解: 受到先入为主的思想影响一直不明白题目表达的意思,直到看到列举才明白表达的是什么问题。深刻的理...

  • 打印从1到最大的n位数

    这是一个大数问题,字符串是表示大数的有效方法;用char类型表示十进制数字没有充分利用内存有一点浪费。 题目1: ...

  • 打印从1到最大的n位数

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

网友评论

    本文标题:打印从1到最大的n位数

    本文链接:https://www.haomeiwen.com/subject/zttgpftx.html