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。
核心思路:
- 首先排除非正整数,因为丑数必须是正整数
- 对于正整数 n,不断地除以 2、3、5,直到无法整除为止
- 如果最终结果为 1,说明原数只包含 2、3、5 这些质因数,是丑数
- 如果最终结果不为 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),只使用常数级别的额外空间 |
相关题目
. Happy Number (Easy)
. Count Primes (Medium)
. Ugly Number II (Medium)