263. 丑数

36 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

263. 丑数 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false

丑数 就是只包含质因数 23 和/或 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 通常被视为丑数。

提示:

  • -2^31 <= n <= 2^31 - 1

二、思路分析:

丑数的质因数只有2、3、5,意味着丑数是可以被2、3、5除尽的,那么余数自然也为 0
为了证明某个数字是否为一个真正的丑数
是需要将该数字除以 2、3或5,最后直到被除数为 1 时,才能最终确定该数字是否丑数
当然如果有更巧妙的解法另当别论
因此,能被2、3、5除尽是一个基本的判断条件,但不能决定该数字是否为丑数
负数是否丑数,答案是不可能的
因为两个负数相乘必然为正数
如果 n 为负数,假设 n 为 -6
两个因数相乘结果为 -6 必然是 -2 * 3 或 3 * -2
那么根据条件 1,这是违背丑数的定义的。

三、AC 代码:

class Solution {
    public boolean isUgly(int n) {
        while(n > 1){
            if(n % 2 == 0) {
                n /= 2;
            } else if(n % 3 == 0){
                n /= 3;
            } else if(n % 5 == 0){
                n /= 5;
            } else {
                return false;
            }
        }
        
        return n > 0;
    }
}

可以反过来这么理解,一个丑数n=2^a3^b5^c,必然是多个2,3,5相乘,逐个除尽即可

范文参考

【负雪明烛】判断丑数,需要注意零和负数 - 丑数 - 力扣(LeetCode)

Java Python3 迭代 击败100% 时间复杂度最低0(logn) - 丑数 - 力扣(LeetCode)