leetcode 2的幂

164 阅读1分钟

给定一个整数,编写一个函数来判断它是否是 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)