Easy

题目描述

丑数是一个正整数,其质因数只包含 2、3 和 5。

给定一个整数 n,如果 n 是丑数,返回 true;否则返回 false。

示例 1:

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

示例 2:

输入:n = 1
输出:true
解释:1 没有质因数。

示例 3:

输入:n = 14
输出:false
解释:14 不是丑数,因为它包含质因数 7。

提示:

  • -2³¹ <= n <= 2³¹ - 1

解题思路

解题思路

这道题要求判断一个数是否为丑数。根据定义,丑数的质因数只能包含 2、3、5。

核心思路:

  1. 首先排除非正整数,因为丑数必须是正整数
  2. 对于正整数 n,不断地除以 2、3、5,直到无法整除为止
  3. 如果最终结果为 1,说明原数只包含 2、3、5 这些质因数,是丑数
  4. 如果最终结果不为 1,说明还有其他质因数,不是丑数

算法步骤:

  • 特殊情况处理:如果 n ≤ 0,直接返回 false
  • 循环处理:while n 能被 2 整除时,n = n / 2
  • 同样处理因子 3 和 5
  • 最后检查 n 是否为 1

这种方法时间复杂度低,逻辑清晰,是最直接有效的解法。

推荐解法: 除法消除质因数法,简单直接,效率高。

代码实现

class Solution {
public:
    bool isUgly(int 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;
    }
};
class Solution:
    def isUgly(self, n: int) -> bool:
        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
public class Solution {
    public bool IsUgly(int 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;
    }
}
/**
 * @param {number} n
 * @return {boolean}
 */
var isUgly = function(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;
};

复杂度分析

复杂度类型分析
时间复杂度O(log n),最坏情况下需要除以 2、3、5 的次数与 n 的位数成正比
空间复杂度O(1),只使用常数级别的额外空间

相关题目