LeetCode - 66. Plus One

題目:

Given a non-negative integer represented as a non-empty array of digits, plus one to the integer.

You may assume the integer do not contain any leading zero, except the number 0 itself.

The digits are stored such that the most significant digit is at the head of the list.


題意解析:

首先這個題目理解了很久,通過查閱各種資料並通過學習提供的測試用例,才理解了其含義。簡單說明如下:

這是個大數加法的問題。理解大數的含義就很容易解答了。舉個例子,

int[] digits = {a, b, c};  //其中a, b, c是int型

則其表示的大數爲 c + b*10 + a*10的平方 。並且這裏的a, b, c 可以是大於9的數字

例如,digits[3] = {2, 9, 36}; 那麼結果爲 326 (36 + 9*10 + 2*100),所以也可以寫成 digits[3] = {3, 2, 6}。


思路與步驟:

先給最後一位加1,然後判斷是否需要進位,同時一個位進位後可能會需要繼續向更高位進位,所以用循環。

但是這裏有個問題,默認digits[0] 最大爲9,所以的最高位需要進位時只需要 新數組的第一個元素爲1(而不需要上面說的digits[0]/10),後面的全爲0即可。

另外看別人的代碼,發現不只是digits[0] 最大爲9,而是digits數組中的所有數字默認爲不大於9,所以進位問題只需要考慮9+1後進1(而不用是digits[i]/10),而且當前位只需要是0即可。測試用例中不包含此外的情況。


編程實現:

public class Solution {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        digits[len-1]++;
        int i=len-1;
        for(; i>=0; i--){
            if(digits[i] < 10)  continue;
            else if(i-1 >= 0 && digits[i] >= 10){
                digits[i-1] += digits[i]/10;
                digits[i] -= (digits[i]/10)*10;
            } else break;
        }

        if(digits[0] >= 10){
            int[] newNumber = new int[len+1];
            newNumber[0] = digits[0]/10;
            return newNumber;
        } else return digits;
    }
}

別人的代碼:

public class Solution {
    public int[] plusOne(int[] digits) {
        int n = digits.length;
        for(int i=n-1; i>=0; i--) {
            if(digits[i] < 9) {
                digits[i]++;
                return digits;
            }
            digits[i] = 0;
        }
        int[] newNumber = new int [n+1];
        newNumber[0] = 1;
        return newNumber;
    }
}

這個代碼,當測試用例爲{2, 9, 36} 這一類情況時會出錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章