0
点赞
收藏
分享

微信扫一扫

算法:丑数

题目描述

编写一个程序判断给定的数是否为丑数。

丑数就是只包含质因数 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)。

总结

这是一道高频考题,答题时,需要注意边界情况的考虑,抓住问题的本质。

举报

相关推荐

0 条评论