1. 程式人生 > 實用技巧 >每日一道 LeetCode (14):陣列加一

每日一道 LeetCode (14):陣列加一

每天 3 分鐘,走上演算法的逆襲之路。

前文合集

每日一道 LeetCode 前文合集

程式碼倉庫

GitHub: https://github.com/meteor1993/LeetCode

Gitee: https://gitee.com/inwsy/LeetCode

題目:陣列加一

題目來源:https://leetcode-cn.com/problems/plus-one/

給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。

最高位數字存放在陣列的首位, 陣列中每個元素只儲存單個數字。

你可以假設除了整數 0 之外,這個整數不會以零開頭。

示例 1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123。

示例 2:

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入陣列表示數字 4321。

解題思路

這道題看完以後,感覺好像很簡單的樣子, LeetCode 最近幾天的題讓我一下感覺自己智商又線上了,甚至有了能暴打 LeetCode 的幻覺。

先說下我的思路,整個陣列取到最後一位,直接 +1 返回,這不完了麼?

感覺自己又能小母牛倒立了。

結果我第一次程式碼寫完,這個世界充滿了惡意,把我的臉又一次的按在了地上摩擦。

最開始的程式碼是這個樣子的:

public int[] plusOne(int[] digits) {
    digits[digits.length - 1] += 1;
    return digits;
}

上面的程式碼沒有問題,可惜沒有考慮 9 , 99 , 999 這種進位的情況。

這就很尷尬了,因為傳入的結構是陣列,傳出的結構也是陣列,總所周知,陣列是不能動態擴容的,這就意味著如果產生了進位我們需要一個新的陣列。

而且我們還需要在計算的時候進行判斷,判斷當前的計算是否產生了進位。

判斷進位在前面的文章中介紹過,很簡單,我們直接取餘數判斷餘數是否為 0 就可以了,如果餘數為0 那麼一定產生了進位。

如果整個陣列的餘數全都變成了 0 ,如 0 , 00 , 000 ,那麼傳入的陣列一定是 9 , 99 , 999 這種,這時候我們搞個新的陣列,直接把開頭賦值成 1 ,剩餘位數全是 0 ,返回就可以了。

程式碼實現

上面已經把思路說的很清晰了,下面是我寫的程式碼:

public int[] plusOne(int[] digits) {
    // 從末尾開始迴圈
    for (int i = digits.length - 1; i >= 0; i--) {
        // 先 +1
        digits[i]++;
        // 取餘數, 10 的餘數為 0
        digits[i] = digits[i] % 10;
        // 判斷餘數是否為 0 ,如果為 0 則再迴圈一次,產生了進位,不為 0 則可以直接返回
        if (digits[i] != 0) return digits;
    }
    // 如果在上面的迴圈未返回,則整體產生進位,類似於 9 , 99 , 999 , 9999 這種陣列
    digits = new int[digits.length + 1];
    digits[0] = 1;
    return digits;
}

註釋標記的很明確了,稍微有點反人類的就是這個迴圈是倒序迴圈,從最後一位開始往前迴圈。好像最近的題使用到的都是倒序迴圈。

陣列操作的效率是極其高效的,而且我發現,但凡是使用陣列操作,在 LeetCode 上基本耗時都是 0ms 。