劍指Offer之打印從1到最大的n位數
阿新 • • 發佈:2017-05-07
一位 數字 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 booleanincrement(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位數