【为进大厂力扣刷题】5. 2 的幂

178 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、题目描述:

231. 2 的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

示例 1:

输入:n = 1
输出:true
解释:20 = 1

示例 2:

输入:n = 16
输出:true
解释:24 = 16

示例 3:

输入:n = 3
输出:false

示例 4:

输入:n = 4
输出:true

示例 5:

输入:n = 5
输出:false

提示:

-231 <= n <= 231 - 1  

进阶:你能够不使用循环/递归解决此问题吗?

二、思路分析:

2的幂次方,用纯数学理解

  1. 一直能除2直到 2/2 = 1
  2. 出现余数或者小数则不符合条件
  3. 特殊情况 n<=0

解法1 数学~

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfTwo = function(n) {
    while(1){
        if(n === 1)return true
        // 有余数、数字转字符串、等于0
        if( n<=0 || n%2===1 || (n+"").indexOf('.')>-1 ){
            return false
        }
        n = n/2
    }
};

image.png

答题的过程中搜到 Number.isInteger也可以判断是否为整数,不过用时效率低一点。

解法2 位运算&

2的幂次方,二进制都是一个1其余都是0。n-1 二进制就是一个0其余都是1

n:     01、10、100、10000。。。。
n-1:   00、01、011、01111.....

通过这个规律,进行 &(按位与)运算,就都变成 0

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfTwo = function(n) {
    return n>0 && (n&(n-1))===0
};

image.png 我靠这个代码好简练。

解法3 对数函数

如果 a^x=N(a>0,且a≠1),那么数x叫做以a为底N的对数,记作 x=logaN,读作以a为底N的对数,其中a叫做对数的底数,N叫做真数

var isPowerOfTwo = function(n) { 
    // x%1 === 0 判断是否为正整数
    return Math.log2(n)%1 === 0 
};

解法4 穷举法

取到 2^x 比 n大的值,再 2^x-1 看看是否相等。

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfTwo = function(n) {
  let i = 0;
  while (Math.pow(2, i) <= n) {
    i++;
  }
  if (Math.pow(2, i - 1) === n) return true;
  return false;
};

解法5 无敌了

太暴力了

/**
 * @param {number} n
 * @return {boolean}
 */
var isPowerOfTwo = function(n) {
  switch (n) {
        case 1:
        case 2:
        case 4:
        case 8:
        case 16:
        case 32:
        case 64:
        case 128:
        case 256:
        case 512:
        case 1024:
        case 2048:
        case 4096:
        case 8192:
        case 16384:
        case 32768:
        case 65536:
        case 131072:
        case 262144:
        case 524288:
        case 1048576:
        case 2097152:
        case 4194304:
        case 8388608:
        case 16777216:
        case 33554432:
        case 67108864:
        case 134217728:
        case 268435456:
        case 536870912:
        case 1073741824:return true;
    }
    return false;
};

力扣大神太多了!!