題目:輸入數(shù)字n,按順序打印出從1最大的n位十進(jìn)制數(shù)咽笼。比如輸入3,則打印出1、2袭厂、3一直到最大的3位數(shù)即999
錯(cuò)誤代碼
//error
void PrintToMaxOfNDigits_1(int n){
int number=1;
int i=0;
while (i++<n)
number*=10;
for (i=1;i<number;++i)
System.out.println(i);
}
如果輸入n很大墨吓,求最大位的n位數(shù)是會(huì)溢出的,應(yīng)該考慮大數(shù)問題
解決方法:
在字符串中模擬數(shù)字加法來(lái)‘纹磺,幾個(gè)注意點(diǎn)帖烘,如何判斷最大,不要調(diào)用比較的方式去處理爽航,因?yàn)槊看伪容^字符串如果長(zhǎng)度為n的字符串他的時(shí)間復(fù)雜度位O(n),只要對(duì)加一進(jìn)位的時(shí)候做邏輯判斷就可以了蚓让,打印的時(shí)候去除開頭的0就可以了
//正確寫法
public static void printToMaxOfDigst(int n){
if (n<=0){
return;
}
char[] num = new char[n];
for(int i = 0;i<n;i++){
num[i] = '0';
}
while (!increment(num)){
System.out.println(num);
}
}
private static boolean increment(char[] num){
boolean isOverflow = false;
int size = num.length;
int carry = 0;
for(int i = size - 1; i >= 0; i--){
int temp = num[i] - '0' + carry;
if(i == size - 1)
temp++;
if(temp >= 10){
if(i == 0) //最高位溢出
isOverflow = true;
else{
temp -= 10;
carry = 1;
num[i] = (char) ('0' + temp);
}
}else{
num[i] = (char)('0' + temp);
break;
}
}
return isOverflow;
}
public void printNumber(char[] num){
int size = num.length;
int i = 0;
while(i < size && num[i] == '0') //i < size在前,否則越界
i++;
if(i == size)//不打印全0
return;
char[] printNum = Arrays.copyOfRange(num, i, size);//復(fù)制數(shù)組
System.out.println(printNum);
}
思路2
遞歸方式去處理讥珍,用字符串去模擬整數(shù)的加法历极,思路比較直觀,但是代碼較長(zhǎng)衷佃。面試過程不容易完整寫出怎么長(zhǎng)的代碼趟卸。如果我們?cè)跀?shù)字前面補(bǔ)0,就會(huì)發(fā)現(xiàn)n位所有十進(jìn)制其實(shí)就是n個(gè)從0到9的全排列氏义,也就是我們把數(shù)字每一位都從0到9進(jìn)行一次排列锄列,就可以得到所有的十進(jìn)制數(shù)字
public void printToMax2(int n){
if(n <= 0) return;
char[] number = new char[n];
Arrays.fill(number, '0');
printOrder(number,n,0);
}
public void printOrder(char[] number, int n, int loc){
if(loc == n) return;
for(int i = 0; i <= 9; i++){
number[loc] = (char)('0' + i);
if(loc == n - 1){
printNumber(number);
}
printOrder(number,n,loc + 1);
}
}
原文鏈接:http://blog.csdn.net/qq_22329521/article/details/53164557