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

LeetCode 728: Self Dividing Numbers

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

基本資料
#

難易度: easy 第一次嘗試:2022-08-31

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

解題思路
#

範圍很小(最多 10^4),逐一檢查就好。用 % 10、// 10 取出每一位(Math 模板五):有任何一位是 0 就不合格(不能除以 0,題目也規定不能含 0),否則檢查 x % d == 0。

我的嘗試
#

這題提交了 18 次:

  • 第一版忘了 return;第二版用 // 判斷整除,i // d != 0 幾乎永遠成立,兩位數全部被排除:(2, 11) 少了 11。
  • 改成 % 之後,遇到 10 這種含 0 的數就 ZeroDivisionError,接下來試了十幾次。其中一版改成「跳過 0 這一位」,10 就被算進去了,但含 0 的數本身就不合格。
  • 最後把判斷寫成一個 helper,遇到 0 直接回傳 False 才 AC。

正確解法
#

class Solution:
    def selfDividingNumbers(self, left: int, right: int) -> List[int]:
        def ok(x):
            n = x
            while n:
                d = n % 10
                if d == 0 or x % d:
                    return False
                n //= 10
            return True
        return [x for x in range(left, right + 1) if ok(x)]

複雜度
#

時間 O((right - left) · log right),空間 O(1)(不算輸出)。

要特別避免的錯誤
#

  • 整除要用 %,不是 //。
  • 含 0 的數直接不合格,不是跳過那一位。

面試口說整理
#

我逐一檢查範圍內的數,用取餘數拿出每一位,遇到 0 或不能整除就不合格。時間是範圍長度乘上位數。

相關文章

LeetCode 628: Maximum Product of Three Numbers
·1 分鐘
LeetCode Easy Array Math Sorting
LeetCode 628 解題筆記:排序後答案只有兩種可能:最大的三個相乘,或最小的兩個(負數)乘最大的一個
LeetCode 598: Range Addition II
·1 分鐘
LeetCode Easy Array Math
LeetCode 598 解題筆記:每次操作都包含左上角,被加最多次的是所有操作的交集:min(a) × min(b)
LeetCode 504: Base 7
·1 分鐘
LeetCode Easy Math String
LeetCode 504 解題筆記:對絕對值不斷取 % 7 和 // 7,最後加上負號並反轉;0 要特別處理
LeetCode 509: Fibonacci Number
·1 分鐘
LeetCode Easy Math Dynamic-Programming Recursion Memoization
LeetCode 509 解題筆記:一維 DP 的起點:只需要前兩項,用兩個變數滾動
LeetCode 415: Add Strings
·1 分鐘
LeetCode Easy Math String Simulation
LeetCode 415 解題筆記:兩個指標從尾巴往前逐位相加,記錄進位,迴圈結束後還有進位要補上
LeetCode 441: Arranging Coins
·1 分鐘
LeetCode Easy Math Binary-Search
LeetCode 441 解題筆記:找最大的 k 讓 k(k + 1) / 2 <= n;二分時往右更新要寫 l = mid + 1,不然會卡住