力扣一题--丑数
为了提升自己,开始刷题
从一篇学习python的公众号接触到力扣这个网站,所以我也开始了自己的刷题之路,以前是在网上找的算法题去做,现在有了这样的一个专业的网站,真是兴奋不已,但是兴奋不已的同时,发现力扣上简单的题型也够我扣半天的,因为受到时间和空间上的限制,不是能解出题就可以的,还要通过它准备的用例,运行时间,运行所需的内存等。
题目:丑数
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
示例 1:
输入:n = 6
输出:true
解释:6 = 2 × 3
示例 2:
输入:n = 8
输出:true
解释:8 = 2 × 2 × 2
示例 3:
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
示例 4:
输入:n = 1
输出:true
解释:1 通常被视为丑数。
提示:
-231 <= n <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ugly-number
这个题当我看到的时候,我的想法就是,首先题目已经说了1是特殊的丑数,那接下来就判断输入的数是正整数,负整数或是零,根据题目得知负数和肯定不是丑数,然后输入数进行质因数分解,分解后的这个数的所有质因数必须只有2,3,5才行,并且将分解的质因数放到一个数组中,再将这个数组和数组[2,3,5]进行拼接,拼接后的数组进行set去重,再转为list后判断是否仍等于[2,3,5],多一个任何其他数都不行。我的解答如下:
```python
def is_ugly(number):
list_judge = []
if number == 1:
return True
elif number <= 0:
return False
elif number > 1:
i = 2
for j in range(1, number):
if number % i == 0 and i <= number:
list_judge.append(i)
number = number // i
else:
i += 1
print("分解后质因数的数列为:",list_judge)
if list(set(list_judge + [2, 3, 5])) == [2, 3, 5]:
return True
else:
return False
确实,这样可以判断一个数是否是丑数,但是提交时,显示运行时间超时,如果不考虑时间,这应该是可以通过的,但是我这样写的结果就是性能太差了,如果判断这个数够大,运行的时间肯定会很长,为了看看到底要运行多久,我写了个装饰器用来计算运行的时间,如下所示:
30多秒的运行时间,还能玩吗?原谅我,我是个菜鸡。
后来我找到一个大神写的代码,瞬间我都想给她跪下,她是阿里的研发工程师,这种算法题对于她来说就是张三吃豆芽,话不多说,代码如下:
def is_ugly(n):
if n <= 0:
return False
while n % 2 == 0:
n //= 2
while n % 3 == 0:
n //= 3
while n % 5 == 0:
n //= 5
return n == 1
当我看到这段代码的时候,我只有膜拜,我的想法太复杂了…她的代码就是先排除小于0的数一定不是丑数,然后再去判断正整数是否是丑数,只需让需要判断的数对2,3,5取余,如果这个数的质因数只有2,3,5那么到最后当最后一个循环跳出来来的n的值一定会等于1,所以return n== 1的意思就是如果n == 1那么返回的就是True,如果这个数的质因数除了,2,3,5之外还有别的数,那么从最后一个循环跳出来的n一定不是1,所以这时n == 1也是不成立的,所以会返回一个False,简直太完美了。。。