剑指Offer之打印从1到最大的n位数

基本思路

  第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位。因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止。代码如下:

public class Print1ToMaxOfDigits {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] number = new int[n];
            while (!increment(number)) {
                printNumber(number);
            }
            //printMaxOfNdigits2(n);

        }
    }
 /**
     * 这个方法是用来实现对数加1操作
     *
     * @param number
     * @return
     */
    public static boolean increment(int[] number) {
        boolean isOverflow = false;//是否有进位
        int nTakeOver = 0;
        int nLength = number.length;
        for (int i = nLength - 1; i >= 0; i--) {
            int nSum = number[i] + nTakeOver;
            if (i == nLength - 1) {
                nSum++;
            }
            if (nSum >= 10) {
                if (i == 0) {
                    isOverflow = true;
                } else {
                    nTakeOver = 1;
                    nSum = nSum - 10;
                    number[i] = nSum;
                }
            } else {
                number[i] = nSum;
                break;
            }
        }
        return isOverflow;
    }

    /**
     * 该方法是负责打印
     *
     * @param number
     */
    public static void printNumber(int[] number) {
        boolean isBegining = true;
        for (int i = 0; i < number.length; i++) {
            if (isBegining && number[i] != 0) {
                isBegining = false;
            }
            if (!isBegining) {
                System.out.print(number[i]);
            }
        }
    }
}

  第二种方法:使用全排列,数字的每一位都可能是0~9中的一个数,然后设置下一位。递归结束的条件是我们已经设置了数字的最后一位。代码如下:

public class Print1ToMaxOfDigits {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] number = new int[n];
//            while (!increment(number)) {
//                printNumber(number);
//            }
            printMaxOfNdigits2(n);

        }
    }

/**
     * 全排序列实现
     *
     * @param number
     * @param length
     * @param index
     */
    public static void printMaxOfNdigitsRecursively(int[] number, int length, int index) {
        if (index == length - 1) {
            printNumber(number);
            return;
        }
        for (int i = 0; i < 10; i++) {
            number[index + 1] = i;
            printMaxOfNdigitsRecursively(number, length, index + 1);
        }
    }

    public static void printMaxOfNdigits2(int n) {
        if (n <= 0)
            return;
        int[] number = new int[n];
        for (int i = 0; i < 10; i++) {
            number[0] = i;
            printMaxOfNdigitsRecursively(number, n, 0);
        }
    }
}

 

posted @ 2017-05-07 10:29  凌风1205  阅读(184)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中