给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
这个其实在熟悉不过了,这就是2的平方嘛,算哪些数是二的平方.
那不是很简单嘛,直接一个循环,加一个pow函数搞定!
bool isPowerOfTwo(int n)
{
if(n==1)
{
return 1;
}
for(int i=1;i<=n;i++)
{
if(pow(2,i)==n)
{
return true;
}
}
return false;
}
走你!
然而leetcode不可能就这么放你过去,他就给你出这些实例.
那么只好再想一想,换一种思路
如果把二的平方数的二进制写出来,会不会好办呢?
1-00000001,2-00000010,4-00000100,8-00001000,16-00010000…
哎,突然发现,好像所有二的平方的二进制都只有一个1哎,那么任务就从算2 的幂到看那个数的二进制有多少个1了.
那如果把二进制一一拆出来放到数组里,然后判断数组中包含1的个数,如果是1个1,那么不就是我们要找的2 的幂吗!卧槽,干!
bool isPowerOfTwo(int n)
{
int arr[100];
int count=0,i=0;
//将二进制一一拆出放到数组里
while(n)
{
arr[i]=n%2;
i++;
n/=2;
}
//如果数组中有一个1,就使计数变量加1
for(int j=0;j<i;j++)
{
if(arr[j]==1)
{
count++;
}
}
if(count==1)
{
return true;
}
else
{
return false;
}
}
我靠,高分通过,牛逼!那这时已经大功告成了.还需要什么操作呢?
再想想,好像位运算这个东西还能优化一下这个代码哎,既然我们之前知道n&(n-1)能够减少掉1位1
例如:1100&1011=1000,那么直接这样一段代码,不就又行了
bool isPowerOfTwo(int n)
{
if((n&(n-1))==0)
{
return true;
}
return false;
}
哦,原来没注意有这种测试用例,那么我们应该杜绝这些特殊用例的出现,因为2 的幂不可能是负数嘛.所以再加上一句判断
if(n<=0)
{
return false;
}
通过,不过看上去好像优化了个寂寞,实际上是减少了很多不必要的步骤的
整体代码
bool isPowerOfTwo(int n)
{
if(n<=0)
{
return false;
}
if((n&(n-1))==0)
{
return true;
}
return false;
}
结束,这里选用了三种较为好理解的方法来做这个题,如有不足,还望指正!