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

LeetCode 9: Palindrome Number

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

基本資料
#

難易度: easy 第一次嘗試:2019-09-17

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

解題思路
#

負數有 - 號,一定不是回文;結尾是 0 的正數也不是(開頭不會是 0)。進階要求不轉字串:用 % 10、// 10 把後半段的位數一個個取下來反轉(Math 模板五),直到反轉的數 >= 剩下的數。位數是偶數時兩者相等;奇數時中間那位在 rev 裡,比較 rev // 10。

我的嘗試
#

  • 2019 年第一次用字串反轉就 AC 了。隔天重寫時把負數的情況寫成 return True,意思寫反了:-6 回傳 True。
  • 2022-05 試著切成兩半比較,但用 / 算中點,得到浮點數不能當 slice 的 index(TypeError),後來又改回字串反轉。

正確解法
#

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
        rev = 0
        while x > rev:
            rev = rev * 10 + x % 10
            x //= 10
        return x == rev or x == rev // 10

複雜度
#

時間 O(log x),空間 O(1)。

要特別避免的錯誤
#

  • 負數回傳 False。
  • 結尾是 0 的正數要先排除,不然 10 會被判斷成回文。
  • / 是浮點數除法,不能拿來當 index。

面試口說整理
#

負數和結尾是 0 的正數先排除,接著把後半段的位數反轉,直到反轉的數不小於剩下的數,再比較兩者,位數是奇數時把中間那位除掉。時間 O(log x),不用轉字串。

相關文章

LeetCode 7: Reverse Integer
·1 分鐘
LeetCode Medium Math
LeetCode 7 解題筆記:記下正負號,對絕對值反轉位數,結果超出 32 位元有號整數的範圍就回傳 0
LeetCode 1: Two Sum
·1 分鐘
LeetCode Easy Array Hash-Table
LeetCode 1 解題筆記:一邊掃一邊把看過的數存進雜湊表,查 target - x 有沒有出現過;先查再存,同一個元素才不會用兩次