LeetCode演算法題66:加一解析
阿新 • • 發佈:2018-11-02
給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。
最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。
你可以假設除了整數 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