打印从1到最大的n位数
题目描述:
输入数字n,按顺序打印出从1到最大的n位十进制数.比如输入3,则打印出1,2,3,…,999
思路:
全排列(使用递归版的DFS实现, 每个数字都是从0到9, 从最高位处理到最低位, 这样打印出来的数字是有序的),从1打印到n个9, n个位置中每一个位置都有10种选择, 可以通过递归实现, 递归终止条件是: 当前处理的是最后一位。
代码:
public class MST17 {
public static void main(String[] args) {
int n = 4;
Print1ToMaxOfNDigits2(n);
}
public static void Print1ToMaxOfNDigits2(int n){
// 健壮性判断
if(n<1)
throw new RuntimeException("n最小值为1");
// 正式执行
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] = (char)(i+48);
Print1ToMaxOfNDigitsRecursive(number, 0, i);
}
}
public static void Print1ToMaxOfNDigitsRecursive(char[] number, int curr, int value){
// 递归终止条件:当前位是个位
if(curr == number.length-1)
PrintNumber2(number);
else{
// 继续处理处理下一位
for(int i=0; i<10; i++){
number[curr+1] = (char) (i+48);
Print1ToMaxOfNDigitsRecursive(number, curr+1, i);
}
}
}
private static void PrintNumber2(char[] number){
//从第一个非零数字开始打印!
boolean flag=true; // 当前位还是0则为ture
for(int i=0; i<number.length; i++){
if(flag && number[i] != '0')
flag = false;
if(!flag && i==number.length-1){
System.out.println(number[i]);
break;
}
if(!flag)
System.out.print(number[i]);
}
}
}