leetcode同样的代码 网上结果和本地结果不一样_Leetcode #263

题目链接: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 

先在自己的调试环境中得出及具体的数值,结果如下:

3d313a32d296de8a2be85e1464fecd95.png

提交 leetcode 的代码如下:

class Solution:
    def isUgly(self, num: int) -> bool:
        return num > 0 and (2 ** 31) * (3 ** 20) * (5 ** 14) % num == 0

数学大法很强大

思路借鉴网上的资源,具体的思路讲解参阅文章

azl397985856/leetcode​github.com
1f9a603a83c778ecd0ac3de59b533670.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值