劍指Offer(Java版):打印1到最大的n位數

題目:輸入數字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的時候,那麼數字98098的形式輸出,就不符合咱們的習慣了

‘0’,‘ 9’, ‘8’, ‘/0’

相關文章
相關標籤/搜索