每日一道 LeetCode (14):陣列加一
每天 3 分鐘,走上演算法的逆襲之路。
前文合集
程式碼倉庫
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 。