系列文章
题目
本来应该是在 CodeWar 拿下一道题,不过在群里看到一道也差不多意思的题目,就顺手放在 CodeWar 系列里了。
先来看看题目:
解析
由于是小测题,所以这里就默认输入为正整数了。
问题核心很明显,就是判断输入的数是不是质数,而质数的特征是:
- 大于 1
- 只能被 1 和自身整除
综合上述条件,我们需要实现的方法只需要进行如下操作即可:
- Step 1:判断值是否为 0 或 1,如果是则返回
false - Step 2:遍历这个数值,每一次遍历,判断当前的值与传入的正整数取余是否为 0,如果有 0 则返回
true - Step 3:遍历结束也没有遇到 0,则返回
false
那么按照步骤将代码一步一步书写出来即可:
const isPrime = n => {
if ([0, 1].includes(n)) {
return false
} else {
for (let i = 2; i < n; i++) {
if (n % i === 0) {
return true
}
}
}
return false
}
emmmmm...这代码真是便秘。
来想想怎么进行优化:
- 首先遍历操作,数组用起来更舒服,那么可以想办法将这个数字转化成数组来遍历
- 其次判断一个质数,真的需要将其整个遍历结束吗?事实上只需要遍历其开根之后的值
+1即可 - 另外,因为遍历数组的方法是函数,所以
return之后还是在isPrime,那么我们可以想到通过map来整合,判断遍历结束的数组中是否存在true
综上,我们来优化一下代码:
const isPrime = n => {
const sqrtNum = Math.floor(Math.sqrt(n) + 1)
return [0, 1].includes(n) ? false : [...Array(n).keys()].slice(2, sqrtNum).map(i => !(n % i)).includes(true)
}
当然,既然都已经这样了,我们可以再把它写的更加精简一点:
const isPrime = n => [0, 1].includes(n) ? false : [...Array(n).keys()].slice(2, Math.floor(Math.sqrt(n) + 1)).map(i => !(n % i)).includes(true)