题目链接:263. 丑数 - 力扣(LeetCode)
题目大意:判断一个正整数是否只含有质因数 2,3,5, 注意 1也算是符合要求的
直观思路:一个数循环除 2,3,5,如果最后为1,证明符合要求。最开始要排除不是正整数的情况。
class
代码精简一下:
class Solution:
def isUgly(self, num: int) -> bool:
if num < 1:
return False
for i in (2,3,5):
while num % i == 0:
num //= i
return num == 1
相同的思路采取递归的方式:
class Solution:
def isUgly(self, num: int) -> bool:
if num == 1:
return True
elif num == 0:
return False
elif num % 2 == 0:
return self.isUgly(num // 2)
elif num % 3 == 0:
return self.isUgly(num // 3)
elif num % 5 == 0:
return self.isUgly(num // 5)
else:
return False
要注意两点:
1. 最开始的if 判断可以设置成
if num == 2 or num == 3 or num == 5 吗
回答是不建议,因为如果num 最开始为 1,就无法从这个出口退出递归,换言之,如果你采取这种方式,就需要再添加递归的出口,让程序更冗杂
2. elif num == 0
这个判断不可以去掉,因为 0 % 任何数 = 0,如果没有这个出口,那么后面的条件判断会不断进行无效的递归,导致空间溢出。
第二种方法:
因为题目中给定了数值的范围 [−2 ** 31, 2**31 − 1],如果一个数只包含质因数2,3,5,一定可以被只包含质因数2,3,5的更大的数整除,所以我们求出在给定范围内的2的最大倍数,3的最大倍数,5的最大倍数,三者相乘,所得值一定可以整除题目给定的丑数,
先求出各自的最大倍数:
def
先在自己的调试环境中得出及具体的数值,结果如下:
提交 leetcode 的代码如下:
class Solution:
def isUgly(self, num: int) -> bool:
return num > 0 and (2 ** 31) * (3 ** 20) * (5 ** 14) % num == 0
数学大法很强大
思路借鉴网上的资源,具体的思路讲解参阅文章
azl397985856/leetcodegithub.com