题目

自除数 是指可以被它包含的每一位数除尽的数。

例如,128 是一个自除数,因为 128 % 1 == 0128 % 2 == 0128 % 8 == 0

还有,自除数不允许包含 0 。

给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。

示例 1:

1
2
3
输入: 
上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

注意:

  • 每个输入参数的边界满足 1 <= left <= right <= 10000。

题解

正常思路

  • 遍历从leftright到每个数
  • 如果这个数符合要求,把它添加到输出列表中
  • 如何判断是否符合要求?
    • 设置一个临时变量等于这个原数
    • 每次让临时变量对10取余,即是临时变量的末尾,比如128对10取余的结果是8
    • 判断原数对这个余数是否能整除,不能就直接break了,进入下一个数
    • 临时变量对自己整除10,比如128整除10就是12了,这样再下个循环中取余就是2
  • 注意两点
    • 取余数后要先判断是否等于0,因为没有办法对0求余数。注意or 运算先算左边再算右边,顺序不能错咯
    • 设置一个临时变量是否等于0的判断,来鉴别while是被break了还是正常结束。

代码

8 行 超简单。

1
2
3
4
5
6
7
8
9
10
class Solution:
def selfDividingNumbers(self, left: int, right: int) -> List[int]:
ans = []
for num in range(left,right + 1):
copy = num
while copy > 0:
div, copy = copy % 10, copy // 10
if div == 0 or num % div != 0: break
else: ans.append(num) # while … else 在循环条件为 false 时执行 else 语句块
return ans

花样一行法

参考https://leetcode-cn.com/problems/self-dividing-numbers/solution/python3-chao-duan-just-for-fun-by-quantumbird/

思路是用生成器和生成器的条件筛选构造一个列表,看代码就懂了,挺清晰的。
提一下 all()函数,是这样的,如果里面的参数每一项都是True,那么返回True,否则返回Falseany()与之对应。

1
2
3
4
class Solution:
def selfDividingNumbers(self, left: int, right: int) -> List[int]:
return [n for n in range(left, right + 1) if \
'0' not in str(n) and all([n % int(b) == 0 for b in str(n)])]