66. Plus One

練習日期:2026-01-15

難度:Easy

類型:Array、Math

📘 題目敘述

給定一個由整數組成的陣列 digits,其中每一個元素代表一個數字的一位,整個陣列代表一個非負整數

請將這個整數 加一,並回傳加一後的結果(仍以陣列形式表示)。

條件限制

  • 1 ≤ digits.length ≤ 100
  • 0 ≤ digits[i] ≤ 9
  • 陣列不會有前導零(除了數字本身是 0)

🧠 解題思路

我在想這題時,是把它當成「手算加法」來處理。

加一這個動作,最直接影響的是:

  • 最後一位數字
  • 以及可能一路往前產生的「進位」

所以我的想法是:

  • 先直接把最後一位加一
  • 如果沒有進位,事情就結束
  • 如果有進位,就一路往前處理
  • 最後再檢查最前面會不會多出一位數

整體邏輯完全對應到我們平常做加法的過程。

所有變數

  • digits:題目給定的數字陣列,同時也是最後要回傳的結果
  • ndigits 的長度
  • check:用來處理進位的索引指標,一開始指向最後一位

🪜 主要流程步驟

第一步:從最後一位開始加一

  • 先將 digits 的最後一位直接加一
  • 因為「加一」一定是從個位數開始影響

第二步:處理可能的進位(從後往前)

接下來檢查是否發生進位:

  • 只要某一位數字大於 9
    • 就減去 10
    • 並把進位加到前一位
  • 然後把指標往前移,繼續檢查

這個過程會一路往前傳遞進位,直到:

  • 不再有進位
  • 或已經處理到最前面一位為止

第三步:處理最前面的特殊情況

如果最後發現:

  • 最前面那一位仍然大於 9

代表原本的數字是像:

  • 999
  • 99
  • 9

這種情況下,加一後會多出一位數。

我的做法是:

  • 把最前面那一位修正成 0
  • 再在陣列最前面插入一個 1

這樣就能正確表示新的數字。


整體邏輯總結

這題的核心就是「模擬加法」:

  1. 從最後一位開始加一
  2. 有進位就往前傳
  3. 最前面如果還有進位,就補一位

整個流程不需要轉成整數或字串,只要用陣列直接操作即可。

💻 程式碼實作

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/

作者: scottnick
撰寫日期: 2026-01-15
類別:
原文連結: https://scottnick.github.io/cpp-notes/all%20problems/66-plus-one.html