LeetCode——第231题:2的幂
1.题目与示例描述
题目:
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入:1
输出:true
解释:2 = 1^{0}
示例 2:
输入:218
输出:false
2.解题思路与题解
解题思路1(普通遍历):
利用一个整型变量temp,从1开始乘以2,每次乘完的结果和目标整数相比,若temp小于目标整数则让temp继续乘以2;若temp等于目标整数,则说明目标整数是2的整数次幂,返回true;当temp大于目标整数,则结束,返回false。
- 题解代码:
public static boolean isPowerOfTwo(int n) {
int temp = 1;
while (temp <= n) {
if (temp == n) {
return true;
}
temp *= 2;
}
return false;
}
- **时间复杂度:**O(logN)
解题思路2(位运算):
将2的整数次幂数如2、4、8写成二进制,可以发现第一位都是1,其余n位都是0,而将其减1,将得到第一位是0,其余位都是1,两数进行与运算,若结果为0,则说明输入的n是2的整数次幂,反之不是。
2x | n | n - 1 | n & (n - 1) |
---|---|---|---|
20 | 0001 | 0000 | 0 |
21 | 0010 | 0001 | 0 |
22 | 0100 | 0011 | 0 |
23 | 1000 | 0111 | 0 |
… | … | … | … |
- 题解代码:
public static boolean isPowerOfTwo2(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
- **时间复杂度:**O(n)
3.完整代码
package power;
public class PowerOfTwo {
/*需要考虑目标整数为负数的情况*/
public static void main(String[] args) {
System.out.println(isPowerOfTwo(-1024));
System.out.println(isPowerOfTwo(5));
System.out.println(isPowerOfTwo(256));
}
public static boolean isPowerOfTwo(int n) {
int temp = 1;
while (temp <= n) {
if (temp == n) {
return true;
}
temp *= 2;
}
return false;
}
public static boolean isPowerOfTwo2(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}