從打印1到最大的n位數

題目:輸入數字n,按順序打印出從1最大的n位十進制數。比如輸入3,則打印出1、2、3一直到最大的3位數即999
錯誤代碼

//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位數是會溢出的,應該考慮大數問題
解決方法:
在字符串中模擬數字加法來‘,幾個注意點,如何判斷最大,不要調用比較的方式去處理,因為每次比較字符串如果長度為n的字符串他的時間復雜度位O(n),只要對加一進位的時候做邏輯判斷就可以了,打印的時候去除開頭的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);//復制數組
        System.out.println(printNum);
    }

思路2

遞歸方式去處理,用字符串去模擬整數的加法,思路比較直觀,但是代碼較長。面試過程不容易完整寫出怎么長的代碼。如果我們在數字前面補0,就會發現n位所有十進制其實就是n個從0到9的全排列,也就是我們把數字每一位都從0到9進行一次排列,就可以得到所有的十進制數字

   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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.把二元查找樹轉變成排序的雙向鏈表 題目: 輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。 要求不...
    曲終人散Li閱讀 3,371評論 0 19
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,778評論 18 399
  • 我們都一樣,我們又都不一樣。 一樣的是,我們在社會中工作生活,要有共同的規律去遵循,正如大道理人人都懂,而不一樣的...
    樂水淘淘閱讀 449評論 2 0
  • 從今天開始認真閱讀李笑來老師的《把時間當作朋友》,把自己的想到的或者思考的內容記錄下來,希望自己在寫作的過程...
    若雨清聽閱讀 162評論 0 0