题目原型
输入一个数字n,请打印从1到n位最大数。例如输入3,则打印1-999的数
分析与注意
由于题目并没有限定n的范围,所以很容易出现n非常大导致使用整型数据时出现溢出的问题。因此我们应当避免使用整型数据作为直接操作数,换一种思路就是使用字符或字符串了。
方法与思路
思路一:使用字符数组递增方式
public static void printNumber(char[] result,int n){
if(n<=0){
return;
}
int overFlow = 0;
//产生数字,为每一位数据产生值
for(int i=n-1;i>=0;i--){
int bitNumber = result[i] - '0' + overFlow;
overFlow = 0;
if(i == n - 1){//如果是最后一位,每次自增1
bitNumber ++;
}
if(bitNumber==10){
overFlow = 1;
bitNumber -= 10;
}
result[i] = (char) (bitNumber + '0');
}
if(overFlow==0){//如果最后一位数都有溢出,那么超出了范围
printNumber(result);
printNumber(result,n);
return;
}
}
思路二:使用全排列方式
public static void permutation(char[] result,int curIndex){
if(result == null || curIndex<0){
return;
}
if(curIndex > result.length - 1){//最后一位也要参与
printNumber(result);
return ;
}
for(int i=0;i<10;i++){
result[curIndex] = (char) ('0' + i);
permutation(result, curIndex+1);
}
}