66. Plus One
EasyDescription
給定一個由整數陣列表示的非負整數
digits,其中digits[i]是第i位數字,最高位在陣列開頭。將這個整數加一後回傳結果陣列。
Example:
Input: digits = [1,2,9] Output: [1,3,0]
Intuition#
核心思路:從最低位開始加一,如果產生進位就繼續向前傳遞,全部進位完則前方補 1。
- 大部分情況只需要把最後一位加 1 即可
- 需要處理進位的情況,例如 [1,2,9] -> [1,3,0]
- 特殊情況:所有位都是 9(如 [9,9,9] -> [1,0,0,0]),需要擴展陣列長度
Approaches#
1: 模擬進位(通用)#
- 概念: 從最低位開始,加上進位值,計算新的進位和當前位的值
- 時間複雜度:
O(n)- n 為陣列長度 - 空間複雜度:
O(1)- 原地修改(最壞情況 O(n) 需要新陣列)
class Solution {
fun plusOne(digits: IntArray): IntArray {
var carry = 1
for (i in digits.lastIndex downTo 0) {
val sum = digits[i] + carry
digits[i] = sum % 10
carry = sum / 10
if (carry == 0) return digits
}
// 全部進位完還有剩餘進位,如 999 -> 1000
val result = IntArray(digits.size + 1)
result[0] = 1
return result
}
}⭐2: 簡化版(針對加一優化)#
- 概念: 由於只加 1,進位只可能是 0 或 1。如果當前位不是 9,加完就可以直接回傳;是 9 則設為 0 繼續
- 時間複雜度:
O(n)- 最壞全是 9 - 空間複雜度:
O(1)- 原地修改(最壞 O(n))
class Solution {
fun plusOne(digits: IntArray): IntArray {
for (i in digits.lastIndex downTo 0) {
if (digits[i] < 9) {
digits[i]++
return digits
}
digits[i] = 0
}
// 走到這裡表示所有位都是 9
val result = IntArray(digits.size + 1)
result[0] = 1
return result
}
}當所有位都是 9 時,新陣列只需要設 result[0] = 1,其餘位自動為 0(IntArray 預設值)。不需要額外複製。
🔑 Takeaways#
- Pattern: 大數加法的簡化版,進位傳遞是核心邏輯
- 關鍵技巧: 針對「只加 1」的特殊性簡化邏輯——不是 9 就直接加、是 9 就變 0 繼續,比通用進位寫法更簡潔