2的幂
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
分析
- n < 0 肯定不是
- 2的幂次方二进制最高位一定是1,其他位都为0,只需要检测其是否只有一个1就可以了,利用n&(n-1)将二进制表示的最右边一个1变成0,本题中看n&(n-1)是否为0即可。
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n&(n-1))==0;
}
}
3的幂
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
示例 1:
输入: 27
输出: true
示例 2:
输入: 0
输出: false
示例 3:
输入: 9
输出: true
示例 4:
输入: 45
输出: false
进阶:
你能不使用循环或者递归来完成本题吗?
分析
n
=
b
x
n=b^x
n=bx,即
n
=
b
∗
b
∗
b
.
.
.
.
∗
b
n=b*b*b....*b
n=b∗b∗b....∗b,如果能整除x,则将除以b
x
x
x次最后得到商为1,如果商不为1,则n不是b的x次幂。
class Solution {
public boolean isPowerOfThree(int n) {
if(n < 1) return false;
while(n % 3 == 0){
n /= 3;
}
return n == 1;
}
}
在4个字节整数范围内,3的幂次最大为 3 19 = 1162261467 3^{19}=1162261467 319=1162261467,所以只要判断其对n取余是否为0即可。因为$ 3^{19} % 3^k =0 $
class Solution {
public boolean isPowerOfThree(int n) {
/*
*/
return n> 0 && 1162261467%n == 0;
}
}
4的幂
class Solution {
public boolean isPowerOfFour(int num) {
String rr = Integer.toString(num, 4);
return rr.matches("^10*$");
}
}
经典解法
class Solution {
public boolean isPowerOfFour(int num) {
if (num < 1){
return false;
}
while(num % 4 == 0){
num /= 4;
}
return num == 1;
}
}
- 4的幂大于0
- 4的幂的二进制表示中只有一位1
- 这个1在偶数位上(从0开始数),奇数位都为0
class Solution {
public boolean isPowerOfFour(int n) {
return n>0 && (n&(n-1))==0 && (n&0xaaaaaaaa)==0;
}
}