加一( Plus-One )
題幹:
給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。
最高位數字存放在陣列的首位, 陣列中每個元素只儲存單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123。
示例 2:
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入陣列表示數字 4321。
來源:力扣
題目比較簡單,解題思路和 讓我們一起啃演算法—-兩數相加 差不多。
解題思路
根據題意,可以將陣列的元素以第一個元素為最高位看成一個正整數,記為 number,然後對 number 做 加一 的操作,需要注意 進位(carry)的問題。由於題目明確說明 陣列的每個元素只儲存單個數字,因此可以得出 只有元素值為 9 才有可能產生進位,且進位值為 1、產生進位的當前元素值會被賦值為 0。
基於上面的分析解題思路自然就出來了:首選初始化 i 指向陣列的最後一個元素。接著對陣列所表示的正整數進行 加 1操作,即對陣列的最後一個元素加一: nums[i] = nums[i] + 1,然後判斷 nums[i] 是否產生進位,其實就是判斷 nums[i] 是否等於 10,或者 nums[i] % 10 是否等於 0 。如果沒有產生進位,則直接返回陣列,反之,則 nums[i] = 0, i 向左移動一位,nums[i] = nums[i] + 1( 因為有低位產生了進位所以要加 1 ),接著判斷 nums[i] 是否仍產生進位,重複上面的判斷流程。
這裡有個注意事項: 當 i 指向了最高位也就是第一個元素時,並且第一個元素是 9,同時又存在進位,則需要對陣列擴容。例如 nums 陣列為 [9, 9, 9] 這時候加一操作之後 nums 為 [1, 0, 0, 0]。
流程圖如下:
程式碼實現
GO語言實現
func plusOne(digits []int) []int {
for i := len(digits) -1; i >= 0; i-- {
// 第一次 加1 操作是題目指定的,後續的 加1 操作是低位的進位
digits[i] ++
// 小於10與10相模值不變,等於10與10相模為0,這一步的主要目的就是當存在進位時當前值為 10 需要將其設定為 0
digits[i] %= 10
// 如果 不等於0 則表示沒有進位,直接返回
if digits[i] != 0 {
return digits
}
// 等於 0 則表示存在進位,由於上面執行了 digits[i] %= 10 ,這時候當前值已經被設定為 0,後續 i-- 之後,執行 digits[i]++ ,是因為有進位 1 需要加上
}
// i 已經越界,並且 digits[0] 為 0 表示存在一個進位 1 ,因此需要對陣列擴容
digits = append([]int{1}, digits...)
return digits
}
總結
每天進步一點點,加油!
演算法教程專案,每天更新一題,點個 star 支援一下呀:
https://github.com/wx-satellite/learning-a…
本作品採用《CC 協議》,轉載必須註明作者和本文連結