剑指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); } } }