做者: 負雪明燭
id: fuxuemingzhu
我的博客: http://fuxuemingzhu.cn/python
題目地址:https://leetcode.com/problems/self-dividing-numbers/description/git
A self-dividing number is a number that is divisible by every digit it contains.app
For example, 128 is a self-dividing number because 128 % 1 == 0, 128 % 2 == 0, and 128 % 8 == 0.ide
Also, a self-dividing number is not allowed to contain the digit zero.函數
Given a lower and upper number bound, output a list of every possible self dividing number, including the bounds if possible.ui
Example 1:lua
Input: left = 1, right = 22 Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
Note:spa
The boundaries of each input argument are 1 <= left <= right <= 10000.
若是一個數字能被它本身的各位數字整除,那麼這個數字是一個自除數字,求在[left, right]雙閉區間內的全部自除數字。code
用了兩個函數,一個用來判斷是不是dividing number,另外一個用來循環和遍歷。ip
要注意的一點是要判斷0是否在num中,不然有除0錯誤。
dividing number 判斷的有點麻煩,就是遍歷每位數字。
class Solution: def isDividingNumber(self, num): if '0' in str(num): return False return 0 == sum(num % int(i) for i in str(num)) def selfDividingNumbers(self, left, right): """ :type left: int :type right: int :rtype: List[int] """ answer = [] for num in range(left, right+1): print(num) if self.isDividingNumber(num): answer.append(num) return answer
參考了https://leetcode.com/problems/self-dividing-numbers/discuss/109445。
有更簡單的兩個函數:
all()判斷是否是全部的元素都知足,
filter過濾掉不知足條件的元素。
class Solution(object): def selfDividingNumbers(self, left, right): is_self_dividing = lambda num: '0' not in str(num) and all([num % int(digit) == 0 for digit in str(num)]) return filter(is_self_dividing, range(left, right + 1))
As pointed out by @ManuelP, [num % int(digit) == 0 for digit in str(num)] creates an entire list which is not necessary. By leaving out the [ and ], we can make use of generators which are lazy and allows for short-circuit evaluation, i.e. all will terminate as soon as one of the digits fail the check.
The answer below improves the run time from 128 ms to 95 ms:
class Solution(object): def selfDividingNumbers(self, left, right): is_self_dividing = lambda num: '0' not in str(num) and all(num % int(digit) == 0 for digit in str(num)) return filter(is_self_dividing, range(left, right + 1))
轉成字符串的方法耗時,其實能夠直接使用數字求餘的方法節省了大量的時間。
時間複雜度是O(N),空間複雜度是O(1)。戰勝98%.
class Solution: def selfDividingNumbers(self, left, right): """ :type left: int :type right: int :rtype: List[int] """ res = [] for num in range(left, right + 1): if self.isDividing(num): res.append(num) return res def isDividing(self, num): temp = num while temp: div = temp % 10 if not div or num % div != 0: return False temp //= 10 return True
2018 年 1 月 13 日 2018 年 11 月 5 日 —— 打了羽毛球,有點累