这一题,我自己想的办法;第二次通过的时候,居然打败了100%,哈哈,可能测得数据集不一样
我没有想到用位运算怎么去做,平时不怎么用位运算,这个得加强
我想的就是,如果模2为0,就说明至少是2的倍数,然后如果为1,就说明不是2的幂;
若是2的倍数,我就递归,使n=n/2;然后继续看是否是2的倍数,直到最后为2,则说明,是2的幂,
我这个算法,对于不是2的幂,很快就能计算出来,但是如果是2的幂,则是O(lgn);
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n==1||n==2) return true;
if(n==0) return false;
if(n<0) return false;
while(n)
{
if(n%2==1) return 0;
n=(n>>1);
if(n==2) return 1;
}
return true;
}
};
别人用得位运算,如果是2的幂,则说明2进制只有最高为为1,而n-1,正好与其互补,只有最高位为0,其他全是1
代码很简单,思路很独特,但是我测试了一下,和我跑的时间差不多。没计算时间复杂度。
class Solution {
public:
bool isPowerOfTwo(int n) {
if(n<=0)
return false;
return ((n&(n-1)) == 0);
}
};