力扣刷题👊【263. 丑数】

261 阅读1分钟

这是我参与8月更文挑战的第 13 天,活动详情查看:8月更文挑战

题目链接

263. 丑数

题目描述

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

丑数 就是只包含质因数 23 和/或 5 的正整数。

敲黑板:丑数,必须是正整数!!!然后,才是只包含若干个 2、3、5 的整数

测试用例

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

提示:

231<=n<=2311-2^{31} <= n <= 2^{31 - 1}

题目分析

换个比较通俗一点的描述,如果一个数 n,是由若干个2, 3, 5 相乘得出,用数学表达式描述则为n = 2 * a + 3 * b + 5 * c,其中,a, b, c >= 0

那么解题的思路就出来了,先用 n 去除 2,等实在不能被 2 整除后,就让 n 去除 3,等不能被 3 整除了,就去除 5 。。。

简简单单的思路,现在我们需要怎么确定 n 可以继续除 2,3,5 下去,当不能整除了,就得换一个数整除。等 2,3,5 都试过了,看最后剩余的数是多少

如果剩余 0 或 1,就表示都除完了,是我们要找的丑数;否则,就不是

尝试解答

根据题目分析,写出第 1 版代码

var isUgly = function(n) {
    if(n <= 0)return false;
    for (; n % 2==0; n = n / 2) {}
    for (; n % 3==0; n = n / 3) {}
    for (; n % 5==0; n = n / 5) {}
    return n ==0||n==1 ? true : false;
};

图片.png

优化总结

怎么说呢,马马虎虎,就是 3 个for 循环排排坐看着有亿点点闹心。当前定义的丑数是质数只有2, 3, 5,后续如果有增加的话,不又得排几个 for 循环??

这个优化就简单了,直接改成质数数组循环里调 for 循环。完美主意害死人

图片.png

var isUgly = function(n) {
    if (n <= 0) return false;
    [2, 3, 5].forEach(m => {
        for (; n % m == 0; n = n / m) {}
    })
    return n == 0 || n == 1 ? true : false;
};