Description
Using O(1) time to check whether an integer n is a power of 2
.
Example
For n=4
, return true
;
For n=5
, return false
;
Challenge
O(1) time
题解:题目要求判断一个数是不是2的幂次方,并且规定时间复杂度为线性级。那么,就不能用常规的循环求解思路去解题了,之前做过一个不用加号求两数之和的题目。这两个题目有点类似,可以通过位运算来快速求解。先考虑这样的一个问题:如果一个数是2的幂次方,会有什么特点?计算机中的数都是以二进制保存在计算机中的。下面我们来举几个例子;
十进制 二进制
2 10
4 100
8 1000
16 10000
。。。。。。
很直观,2的幂次方有个特点:只有一位是1,其余的都是0.那么怎么利用这个性质呢?有个巧妙的方法:
n n-1
10 01
100 011
1000 0111
10000 01111
。。。。。。
会发现,n-1和n每一位都不相同,如果做与(&)运算,那么结果应该为0,这样,这个问题就可以解决了。代码如下:
public class Solution { /** * @param n: An integer * @return: True or false */ public boolean checkPowerOf2(int n) { // write your code here if(n<=0) return false; return ((n&(n-1))==0)? true:false; } }