📘 題目敘述
給定一個由整數組成的陣列 digits,其中每一個元素代表一個數字的一位,整個陣列代表一個非負整數。
請將這個整數 加一,並回傳加一後的結果(仍以陣列形式表示)。
條件限制
1 ≤ digits.length ≤ 1000 ≤ digits[i] ≤ 9- 陣列不會有前導零(除了數字本身是 0)
🧠 解題思路
我在想這題時,是把它當成「手算加法」來處理。
加一這個動作,最直接影響的是:
- 最後一位數字
- 以及可能一路往前產生的「進位」
所以我的想法是:
- 先直接把最後一位加一
- 如果沒有進位,事情就結束
- 如果有進位,就一路往前處理
- 最後再檢查最前面會不會多出一位數
整體邏輯完全對應到我們平常做加法的過程。
所有變數
digits:題目給定的數字陣列,同時也是最後要回傳的結果n:digits的長度check:用來處理進位的索引指標,一開始指向最後一位
🪜 主要流程步驟
第一步:從最後一位開始加一
- 先將
digits的最後一位直接加一 - 因為「加一」一定是從個位數開始影響
第二步:處理可能的進位(從後往前)
接下來檢查是否發生進位:
- 只要某一位數字大於 9
- 就減去 10
- 並把進位加到前一位
- 然後把指標往前移,繼續檢查
這個過程會一路往前傳遞進位,直到:
- 不再有進位
- 或已經處理到最前面一位為止
第三步:處理最前面的特殊情況
如果最後發現:
- 最前面那一位仍然大於 9
代表原本的數字是像:
999999
這種情況下,加一後會多出一位數。
我的做法是:
- 把最前面那一位修正成 0
- 再在陣列最前面插入一個
1
這樣就能正確表示新的數字。
整體邏輯總結
這題的核心就是「模擬加法」:
- 從最後一位開始加一
- 有進位就往前傳
- 最前面如果還有進位,就補一位
整個流程不需要轉成整數或字串,只要用陣列直接操作即可。
💻 程式碼實作
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
int n = digits.size();
int check = n - 1;
digits[check]++;
while (check > 0) {
if (digits[check] > 9) {
digits[check] -= 10;
digits[check - 1]++;
check--;
} else {
break;
}
}
if (digits[check] > 9) {
digits[check] -= 10;
digits.insert(digits.begin(), 1);
}
return digits;
}
};
🔗 題目連結
https://leetcode.com/problems/plus-one/