231. Power of Two
题目描述和难度
- 题目描述:
给定一个整数,写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1 输出: true
示例 2:
输入: 16 输出: true
示例 3:
输入: 218 输出: false
- 题目难度:简单。
- 英文网址:231. Power of Two 。
- 中文网址:231. 2的幂 。
思路分析
求解关键:方法很多,给出几个比较好理解的。我个人觉得主要的考点还是在位运算的一些性质上。
参考解答
参考解答1:可能是最简单的一个版本吧,n & (n - 1)
运算,能把一个二进制数最右边的 1 变成 0,这一点应该作为一条基本性质记住。
public class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
参考解答2:该方法可以用于整除判断。
public class Solution2 {
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
}
参考解答3:用到了 Java 库函数,并且还可以根据此法判定一个数是否是 3 的方幂、4 的方幂等等。
public class Solution3 {
public boolean isPowerOfTwo(int n) {
return n > 0 && Integer.toString(n, 2).matches("^10*$");
}
}
参考解答4:打表法,把所有可能的结果都例举出来。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
public class Solution4 {
public boolean isPowerOfTwo(int n) {
if (n <= 0) {
return false;
}
// 比 Integer.MAX_VALUE 小的所有的整数中 2 的方幂的所有的数
int[] nums = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824};
HashSet<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
return set.contains(n);
}
// 该 main 方法可以得到整型范围内所有的 2 的方幂
public static void main(String[] args) {
int i = 1;
List<Integer> list = new ArrayList<>();
while (i > 0 && i < Integer.MAX_VALUE) {
list.add(i);
i *= 2;
}
System.out.println(list);
}
}
参考解答5:该方法对于判定质数的方幂同样有效,例如判定一个数是否是 3 的方幂,不过得事先计算出在允许的范围内 3 的方幂的最大者。
public class Solution5 {
public boolean isPowerOfTwo(int n) {
// 1073741824 是小于 Integer.MAX_VALUE 中 2 的方幂的最大者
return n > 0 && 1073741824 % n == 0;
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0231-power-of-two ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。