题意
判断一个数n是否是2的幂次。
思路
算法1
时间复杂度 O(logn) 。
直接检查n能否一直除以2直到1。
算法2
时间复杂度 O(1)
非常trick的一个思路,我们知道n如果是2的幂次,那么n的2进制表示中一定是1后面跟若干个0,即只有一个1。
我们利用·n & (n - 1)
的性质:将最低一位1置0,即此时n & (n - 1) = 0
代码
algorithm 1
class Solution {
public:
bool isPowerOfTwo(int n) {
if (n <= 0) return false;
while (n % 2 == 0) n >>= 1;
return n == 1;
}
};
algorithm 2
class Solution {
public:
bool isPowerOfTwo(int n) {
return n <= 0 ? false : !(n & (n - 1));
}
};