题目
难度:★☆☆☆☆
类型:数学
自除数 是指可以被它包含的每一位数除尽的数。
例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
还有,自除数不允许包含 0 。
给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
注意
每个输入参数的边界满足 1 <= left <= right <= 10000。
示例
输入:
上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
解答
这道题的思路很简单,我们可以构建一个判定一个数是否为自除数的函数,然后从范围中筛选出自除数即可。
转成字符串方式:
class Solution:
def selfDividingNumbers(self, left, right):
is_div_num = lambda n: not any([n % int(b) if b != '0' else 1 for b in list(str(n))])
return [n for n in range(left, right+1) if is_div_num(n)]
为了提高运行效率,我们通过除法运算判定自除数的存在:
class Solution:
def selfDividingNumbers(self, left: int, right: int):
def is_div_num(num):
val = num
while num % 10 != 0 and val > 0: #
tmp = val % 10 # 取出来最小位
if tmp == 0 or num % tmp != 0: # 如果当前位为零或者不能被原数整除
return False # 返回False
else: # 否则
val //= 10 # 去除val最后一位
if val == 0: # 如果所有位都经过判定
return True # 返回True
res = []
for num in range(left, right+1):
if is_div_num(num):
res.append(num)
return res
如有疑问或建议,欢迎评论区留言~