题目描述
题干:
给你一个整数 n,请你判断该整数是否是 2 的幂次方。
如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
示例 1:
输入:n = 1
输出:true
解释:20 = 1
示例 2:
输入:n = 16
输出:true
解释:24 = 16
示例 3:
输入:n = 3
输出:false
示例 4:
输入:n = 4
输出:true
示例 5:
输入:n = 5
输出:false
题解思路
判断数字是不是2的幂,虽然题目下推荐我们不使用迭代或递归解决,但是我还是写了写
并且都超出了时间限制,所以主要讲讲其他方法,2最大幂的因子我一开始也觉得不靠谱
后来发现确实2的幂的因子确实都是2的幂,而位运算的方法就是需要发现一个规律
如果一个数字是2的幂,那他的二进制就只有一位是1,下面两种写法就见仁见智了
正确代码
class isPowerOfTwoSolution {
static final int BIG = 1 << 30;
//递归
public boolean isPowerOfTwo01(int n) {
if (n == 1) {
return true;
}
if (n < 0 || n % 2 != 0) {
return false;
}
return isPowerOfTwo01(n / 2);
}
//迭代
public boolean isPowerOfTwo02(int n) {
if (n < 0) {
return false;
}
while (n % 2 == 0) {
n /= 2;
}
return n == 1;
}
//最大二的幂的约数
public boolean isPowerOfTwo03(int n) {
return (n > 0) && (BIG % n) == 0;
}
//位运算
public boolean isPowerOfTwo04(int n) {
return (n > 0) && (n & (n - 1)) == 0;
}
//位运算2
public boolean isPowerOfTwo05(int n) {
return (n > 0) && Integer.bitCount(n) == 1;
}
}
总结
结合位运算方法可以灵活解决很多算法问题,要善于发现规律和联系并牢记位运算的公式和规则
如果文章存在问题或者存在更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见