[leetcode]Python实现-263.丑数

本文介绍了一种判断丑数的有效算法。丑数定义为仅含有质因数2、3、5的正整数。文中提供了两种实现方法,并进一步探讨了求解第n个丑数的问题及其高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

263.丑数

描述

编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。

示例

输入: 6
输出: true
解释: 6 = 2 × 3

输入: 8
输出: true
解释: 8 = 2 × 2 × 2

输入: 14
输出: false
解释: 14 不是丑数,因为它包含了另外一个质因数 7。

说明:
1 是丑数。
2 输入不会超过 32 位有符号整数的范围: [−231, 231 − 1]。


思路:num反复除2,3,5直到不能整除。

class Solution:
    def isUgly(self, num):
        """
        :type num: int
        :rtype: bool
        """
        l = [2,3,5]
        if num < 1:
            return False
        if num == 1 or num in l:
            return True
        i = 0
        while i < len(l):
            if num % l[i] != 0:
                i += 1
            else:
                num = num // l[i]
                if num in l:
                    return True
                i = 0
        return False

别人的暴力破解,思路非常简单,首先除2,直到不能整除为止,然后除5到不能整除为止,然后除3直到不能整除为止。 最终判断剩余的数字是否为1,如果是1则为丑数,否则不是丑数。

class Solution:
    def isUgly(self, num):
        """
        :type num: int
        :rtype: bool
        """
        while num >0 and num%2==0:
            num /= 2
        while num >0 and num%3==0:
            num /= 3
        while num >0 and num%5==0:
            num /= 5
        return True if num == 1.0 else False

有时候分析问题要直击重点,比如此题。就考虑能否被2,3,5整除即可。
相关题目:
求第n个丑数 –来源《剑指offer》
思路:每一个丑数必然是之前丑数与2,3或5的乘积得到的,这样下一个丑数就是用之前的丑数分别乘以2,3,5,找出这三种最小的并且大于最大丑数的值,即为下一个要求的丑数。
首先想办法从上一个丑数判断出下一个丑数,而不须要从1開始遍历再判断。从1開始的10个丑数分别为1,2。3,4,5,6,8。9。10。12。
能够发现除了1以外。丑数都是由某个丑数*2或者*3或者*5得到的。
如2是丑数1*2得到的,3是丑数1*3得到的。4是丑数1*4得到的。5是丑数1*5得到的。6是丑数2*3得到的……
详细算法步骤:
(1)从第一个丑数1開始,求出1*2=2 ,1*3=3 ,1*5 = 5。
(2)取上面乘积中大于1的最小值2,作为第二个丑数(丑数是个递增序列。所以第i+1个丑数一定比第i个丑数)
(3)求丑数2之前的丑数与2、3、5的乘积:1*2=2 ,1*3=3 ,1*5 = 5; 2*2 = 4; 2*3 = 6。 2*5 =10。
(4)取上面乘积中大于2的最小值3,作为第三个丑数
……
……

(i)取出丑数i之前的丑数分别与2、3、5的乘积

(i+1)取乘积中大于i的最小值作为丑数

(i+2)反复(i)(i+1)的步骤直到计数器等于N

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值