题目
给一个正整数,判断这个数是不是2的整数次幂,比如16 = 2^4,返回ture; 15非2的整数次幂,返回false
暴力枚举法
设置初始值temp为1,只要temp小于输入的整数num时,就循环让temp乘以2。循环结束后,如果temp等于num,则代表它是2的整数次幂,否则则不是
- 时间复杂度:O(logn)
/**
* @description 判断一个整数是不是2的整数次幂
* @param num:输入的整数
* @return res: 结果,返回true或false
*/
function isPowerOf2(num) {
let temp = 1;
while(temp < num) {
temp *= 2
}
return temp === num;
}
console.log(isPowerOf2(16)); // true
高效解法 num & num(n-1) === 0
我们先看下2的整数次幂的二进制有什么特点:
2 -------- 10
4 -------- 100
8 -------- 1000
16 -------- 1 0000
32 -------- 10 0000
2的整数次幂的二进制除了首位为1,其它位置都为0
我们再看下2的整数次幂-1的二进制有什么特点:
1 -------- 01
3 -------- 011
7 -------- 0111
16 -------- 0 1111
32 -------- 01 1111
2的整数次幂-1的二进制除了首位为0,其它位置都为1
两者做与运算,刚刚好可以得到0
利用以上这个特性,可以解得 O(1)的算法:
function isPowerOf2(num) {
return (num & num - 1) === 0;
}
console.log(isPowerOf2(16)); // true
网友评论