問題描述
給定一個非負整數,以數組形式存儲(最高位在頭),對其加 1,返回結果數組。例如 [1,2,3] → [1,2,4];[9,9] → [1,0,0]。
模擬加法邏輯
從最低位(數組末尾)向最高位遍歷,處理進位:
- 初始進位 carries = 1(即加 1)。
- 對每位:sum = digits[i] + carries;digits[i] = sum % 10;carries = sum / 10。
- 若 carries 變 0 可提前結束。
- 遍歷結束後若 carries = 1,說明最高位產生進位(如 999→1000),需創建新數組,長度 +1,首位置 1,其餘 0。
代碼實現要點
提供的 Java 代碼邏輯清晰:
- for 循環條件 `i >= 0 && carries > 0` 實現提前終止優化。
- 原地修改 digits 數組,空間 O(1)(不計輸出)。
- 進位處理統一用 sum % 10 和 sum / 10,避免分支判斷。
- 擴容時新建數組 `rst`,首位賦 1,其餘默認 0(Java 新數組自動初始化為 0)。
複雜度分析
- 時間:O(n),n 為數組長度,單次遍歷。
- 空間:O(1) 額外空間(最壞情況擴容 O(n) 但屬於輸出必要空間)。
邊界情況
- 輸入 [0] → [1]
- 輸入 [9,9,9] → [1,0,0,0]
- 輸入 [] 不合法(題目保證非負整數,至少一位)。
總結
本題是基礎模擬題,考察進位處理、邊界條件及數組操作。關鍵在於從低位向高位處理、統一進位邏輯、提前終止優化。代碼簡潔健壯,屬於標準解法。