这是我参与8月更文挑战的第 13 天,活动详情查看:8月更文挑战
题目链接
题目描述
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
敲黑板:丑数,必须是正整数!!!然后,才是只包含若干个 2、3、5 的整数
测试用例
输入: n = 6
输出: true
解释: 6 = 2 × 3
提示:
题目分析
换个比较通俗一点的描述,如果一个数 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;
};
优化总结
怎么说呢,马马虎虎,就是 3 个for 循环排排坐看着有亿点点闹心。当前定义的丑数是质数只有2, 3, 5,后续如果有增加的话,不又得排几个 for 循环??
这个优化就简单了,直接改成质数数组循环里调 for 循环。完美主意害死人
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;
};