“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的幂次方,用纯数学理解
- 一直能除2直到
2/2 = 1 - 出现余数或者小数则不符合条件
- 特殊情况
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
}
};
答题的过程中搜到
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
};
我靠这个代码好简练。
解法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;
};
力扣大神太多了!!