↓快轉到主要內容
  1. LeetCode/

LeetCode 66: Plus One

·1 分鐘· ·
LeetCode Easy Array Math
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-05-11

  • 提交紀錄:Runtime Error ×3 → Wrong Answer → Accepted ×4 → Runtime Error ×2 → Accepted → Wrong Answer ×4 → Accepted ×3

解題思路
#

直式加法(Math 模板六):從最後一位開始,不是 9 就直接加一回傳;是 9 就變成 0、繼續往前進位。迴圈跑完代表每一位都是 9,前面補一個 1。

我的嘗試
#

前面幾版都是「轉成整數加一再拆回來」:

  • 2022-05:''.join(digits) 的元素是整數(TypeError);改好之後用 str(...).split() 拆,split 是用空白切,整個數字只是一個元素:[9] 回傳 [10],答案 [1, 0]。
  • 2022-08 改成自己算 digits[i] * 10 ** k:先寫成 10^k,^ 在 Python 是 XOR:[1] 回傳 [1, 1];改成 10**len(digits)-1-i 又少了括號,算成 10**len - 1 - i:[1] 回傳 [1, 0]。
  • 2022-10 才改成上面的逐位進位寫法。

正確解法
#

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        for i in range(len(digits) - 1, -1, -1):
            if digits[i] < 9:
                digits[i] += 1
                return digits
            digits[i] = 0
        return [1] + digits

複雜度
#

時間 O(n),空間 O(1)(不算全部是 9 時的新陣列)。

要特別避免的錯誤
#

  • 10^k 在 Python 是 XOR,次方是 10**k;而且 10**len - 1 - i 要加括號。
  • 回傳的是數字的 list,str(...).split() 只會得到一個元素。

面試口說整理
#

我從最後一位往前做進位:不是 9 就加一直接回傳,是 9 就變 0 繼續往前,全部都是 9 的話最前面補 1。時間 O(n),不需要轉成整數。

相關文章

LeetCode 27: Remove Element
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 27 解題筆記:寫入指標只寫不等於 val 的數,最後回傳寫入的個數
LeetCode 35: Search Insert Position
·1 分鐘
LeetCode Easy Array Binary-Search
LeetCode 35 解題筆記:找第一個 >= target 的位置(lower bound);半開區間 [l, r) 要配 r = mid,不能寫 r = mid - 1
LeetCode 67: Add Binary
·1 分鐘
LeetCode Easy Math String Bit-Manipulation Simulation
LeetCode 67 解題筆記:從兩個字串的尾巴往前逐位相加,進位是 sum // 2,這一位是 sum % 2
LeetCode 26: Remove Duplicates from Sorted Array
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 26 解題筆記:快慢指針原地覆寫,慢指針指向下一個要寫的位置;遇到跟前一個寫入的值不同才寫
LeetCode 14: Longest Common Prefix
·1 分鐘
LeetCode Easy Array String Trie
LeetCode 14 解題筆記:用最短的字串當上限,逐個位置檢查所有字串是否相同,第一個不同的位置就是答案的長度
LeetCode 9: Palindrome Number
·1 分鐘
LeetCode Easy Math
LeetCode 9 解題筆記:負數一定不是回文;不轉字串的話,把後半段的數字反轉,跟前半段比較