這題我們要將給定的數字陣列視作一個整數,並對其進行加一操作,最終返回加一後的結果作為陣列形式。
題目:
給定一個非負整數陣列 digits
,每個元素代表該整數的一個位數。假設數字是以非負整數的形式存儲在陣列中,且數字的最高位存放在陣列的開頭,陣列中的每個元素僅包含一個數字 0-9
。我們需要對整數加 1
,並返回加一後的新陣列表示。
範例:
輸入: digits = [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123,加 1 後變為 124。
輸入: digits = [4,3,2,1]
輸出: [4,3,2,2]
輸入: digits = [9,9,9]
輸出: [1,0,0,0]
解釋: 輸入陣列表示數字 999,加 1 後進位變為 1000。
處理進位問題,並從低位開始處理,
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
vector<int> res;
int carry = 1;
for (int i = digits.size()-1; i >= 0; i--) {
int sum = digits[i] + carry;
res.push_back(sum % 10);
if (sum > 9)
carry = 1;
else
carry = 0;
}
if (carry == 1) res.push_back(carry);
reverse(res.begin(), res.end());
return res;
}
};
思考有更好的解法?是否不用另一個變數跟反轉呢?
假如 +1 後不用進位的話馬上就可以回傳結果了,
如果是連續都是9的話就會一直迴圈進位,如果執行到迴圈結束的話,表示還能再進位,就在頭部插入1,
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for (int i = digits.size()-1; i >= 0; i--) {
if (digits[i] < 9) {
digits[i]++;
return digits;
} else {
digits[i] = 0; // 進位
}
}
digits.insert(digits.begin(), 1); // 進位
return digits;
}
};
考慮到連續進位的話基本上全都為0,只有最高位為1,那麼原本這樣寫
digits.insert(digits.begin(), 1);
也可以改成這樣寫,
digits[0] = 1;
digits.push_back(0);