讓我們一起啃演算法----加一

三斤和他的喵發表於2020-04-27

加一( 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 協議》,轉載必須註明作者和本文連結

三斤

相關文章