1. 程式人生 > >劍指Offer之打印從1到最大的n位數

劍指Offer之打印從1到最大的n位數

一位 數字 print digi mic boolean 基本 個數 recursive

基本思路

  第一種方法:當我們只有對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);
        }
    }
}

劍指Offer之打印從1到最大的n位數