1. 程式人生 > >LeetCode演算法題66:加一解析

LeetCode演算法題66:加一解析

給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。
最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123。

示例2:

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入陣列表示數字 4321。

這個題分析起來一個比較直觀的思路就是進位直接加和,但是要考慮兩種情況,一種是位數不會發生變化,另一種就是類似999這類數字,一旦加一位數就會加一,所以首先判斷是否所有數字都為9,如果是,則直接用一個長度比原來陣列多一位的陣列輸出首位為1,其餘位為0的陣列代替原陣列輸出。否則就是位數不變,只需要考慮進位就可以,那麼只要先在最後一位加1,然後反向遍歷整個陣列,如果當前位加上進位大於10產生了進位則繼續向前遍歷,並把當前位置為其對10的餘數。如果沒有產生進位直接退出遍歷返回陣列。
C++原始碼:

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int num = 0, i = 0;
        int len = digits.size();
        for (i=0;i<len;i++)
        {
            if (digits[i]!=9)
                break;
        }
        if (i==len)
        {
            vector<
int> result(len+1); result[0] = 1; for (int j=1;j<len+1;j++) result[j] = 0; return result; } int carry = 0; digits[len-1] += 1; for (i=len-1;i>=0;i--) { digits[i] += carry; carry =
digits[i] / 10; digits[i] = digits[i] % 10; if(carry == 0) break; } return digits; } };

python3原始碼:

class Solution:
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        if len(set(digits))==1 and (9 in set(digits)):
            result = [1]
            for i in range(1,len(digits)+1):
                result.append(0);
            return result
        carry = 0
        digits[len(digits)-1] += 1
        for i in range(len(digits)-1, -1, -1):
            digits[i] += carry
            carry = digits[i] // 10;
            digits[i] = digits[i] % 10;
            if carry==0:
                break
        return digits