題目:輸入數字n,按順序打印出從1最大的的n位數十進制數。好比輸入3,則打印出1,2,3一直到最大的3位數即999.git
一、跳進面試官的陷阱面試
這個題目看起來很簡單。咱們看到這個問題後,最容易想到的辦法是求出最大的n位數,而後用一個循環從1開始逐個打印。因而咱們很容易寫出下面的代碼。數組
package cglib;spa
public class List1
{
public static int print1ToMaxOfNDigits(int n){字符串
int number =1;it
int i =0;io
while(i++< n)class
number*=10;List
for(i =1;i<number;i++)
System.out.println(i);
return i;循環
}
public static void main(String[] args) throws Exception{
print1ToMaxOfNDigits(3);
}
}
初看之下沒有問題,但若是仔細分析這個問題,咱們就能注意到面試官沒有規定n的範圍。當輸入n很大的時候,咱們求最大的n位數是否是用整型(int)或者長整型(long long)都會溢出?也就是說咱們須要考慮大數問題。這是面試官在這道題裏設置的一個大陷阱。
二、在字符串上模擬數字加法的解法:
通過前面的分析,咱們很天然的想到解決這個問題須要一個大數。最經常使用的也是最容易的用字符串或者數組表達大數。接下來咱們用數組來解決大數問題。
用字符串表達數字的時候,最直觀的方法就是字符串裏每一個字符都是’0’到’9’之間的某一個字符,表示數字中的某一位。由於數字最大是n位的,所以咱們須要一個n+1位字符串(最後一位爲結束符號’/0’)。當實際數字不夠n位的時候,在字符串的前半部分補零。這樣,數字的個位永遠都在字符串的末尾(除去結尾符號)。如n=3,則須要4位字符串,‘1’,‘ 2’, ‘3’, ‘/0’,
不夠時就是 ‘0’,‘ 0’, ‘3’, ‘/0’ ,
首先咱們把字符串中每一位數字都初始化爲’0’。而後每一次對字符串表達的數字加1,再輸出。
‘0’,‘ 0’, ‘0’, ‘/0’ ,第一次 ‘0’,‘ 0’, ‘1’, ‘/0’
所以咱們只須要作兩件事:一是在字符串表達的數字上模擬加法。另外咱們要把字符串表達的數字輸出。值得注意的是,當數字不夠n位的時候,咱們在數字的前面補零。輸出的時候這些補位的0不該該輸出。好比輸入3的時候,那麼數字98以098的形式輸出,就不符合咱們的習慣了
。
‘0’,‘ 9’, ‘8’, ‘/0’