力扣一题--丑数

为了提升自己,开始刷题

从一篇学习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,简直太完美了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值