题目描述
编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数 2, 3, 5 的正整数。
示例 1:
输入: 6
输出: true
解释: 6 = 2 × 3
示例 2:
输入: 8
输出: true
解释: 8 = 2 × 2 × 2
示例 3:
输入: 14
输出: false
解释: 14 不是丑数,因为它包含了另外一个质因数 7。
详细描述:263. 丑数
思路
根据丑数的定义,0 和负整数一定不是丑数。我们将给定数字除以 2、3、5(顺序无所谓),直到无法整除。 如果得到 1,说明是所有因子都是 2 或 3 或 5,如果不是 1,则不是丑陋数。
这就好像我们判断一个数字是否为 n(n 为大于 1 的正整数)的幂次方一样,我们只需要 不断除以 n,直到无法整除,如果得到 1,那么就是 n 的幂次方。 这道题的不同在于 它不再是某一个数字的幂次方,而是三个数字(2,3,5),不过解题思路还是一样的。
转化为代码可以是:
while (num % 2 === 0) num = num / 2;
while (num % 3 === 0) num = num / 3;
while (num % 5 === 0) num = num / 5;
return num === 1;
实现
var isUgly = function (num) {
if (num <= 0) return false;
if (num === 1) return true;
const list = [2, 3, 5];
if (list.includes(num)) return true;
for (let i of list) {
if (num % i === 0) return isUgly(Math.floor(num / i));
}
return false;
};
时间复杂度:$O(log n)$。时间复杂度取决于对 $n$ 除以 $2$,$3$,$5$ 的次数,由于每次至少将 $n$ 除以 $2$,因此除法运算的次数不会超过 $O(log n)$。
空间复杂度:O(1)O(1)。
总结
这是一道高频考题,答题时,需要注意边界情况的考虑,抓住问题的本质。
标签:丑数,示例,复杂度,除以,while,算法,num From: https://blog.51cto.com/codeniu/6462879