05 August 2008
Given an integer, write a function to determine if it is a power of two.
Example 1:
1
2
3
Input: 1
Output: true
Explanation: 20 = 1
Example 2:
1
2
3
Input: 16
Output: true
Explanation: 24 = 16
Example 3:
1
2
Input: 218
Output: false
判断一个是否是2的幂,这道题自然可以用recursive或者iterative来做(O(log n)),
也可以用n & (n - 1),
因此我们看出,如果n是2的方幂,二者刚好位数全部不一样,那么做与操作n & (n-1) == 0b0000…0000 == 0;
否则比如 n =14 = 0b0000…1110, and (n - 1) = 13 = 0b0000…1101,n & (n-1) == 0b0000…1100 != 0.
另外n当然不能是0或负数。
Time O(1) :Space:O(1);
迭代
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
}
递归
1
2
3
4
5
6
7
8
9
10
11
class Solution {
public boolean isPowerOfTwo(int n) {
if (n == 1) {
return true;
} else if (n <= 0 || n % 2 != 0) {
return false;
} else {
return isPowerOfTwo(n / 2);
}
}
}
若 n = 2^x,且 x 为自然数(即 n 为 2 的幂),则一定满足以下条件:
恒有 n & (n - 1) == 0,这是因为:
因此,通过 n > 0 且 n & (n - 1) == 0 即可判定是否满足 n = 2^x。
1
2
3
4
5
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && ((n & (n - 1)) == 0);
}
}