给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
我的算法实现,这个比较简单:
/**
* @param {number} n
* @return {boolean}
*/
var isPowerOfTwo = function(n) {
let i = 0;
// 一直找,最后再判断是否相等
while(Math.pow(2, i++) <= n);
return Math.pow(2, i - 2) === n;
};
这个所需要花费的时间比较久,最主要的原因是循环找的过程中每一步都走了。我会继续优化,正确超过百分之90的人,这个耗时: 112ms。
这个我们知道其实没有必要计算指数,指数的计算也需要花费一定的时间,于是我的优化如下:
var isPowerOfTwo = function(n) {
let i = n;
// 通过除法直接到达最后
while((i = i/2) >= 1);
// 如果在小于 1 的情况下刚好等于 0.5 ,说明是
return i === 0.5;
};
这个比上面那个要快,耗时: 96ms。接着优化。
来源:力扣(LeetCode)