问题:
Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion?
解决:
① 不停的除以4.
class Solution { // 2ms
public boolean isPowerOfFour(int num) {
while(num > 0 && num % 4 == 0){
num /= 4;
}
return num == 1;
}
}
② 使用log函数
class Solution { // 3ms
public boolean isPowerOfFour(int num) {
return num > 0 && (int)(Math.log10(num) / Math.log10(4)) - (Math.log10(num) / Math.log10(4)) == 0;
}
}
③ num & (num - 1)可以用来判断一个数是否为2的次方数,由于是32位的整数,4的次方数的二进制中1只可能出现在1,3,5,7.。。。。。31这些位置。因此我们乘以0x55555555即可,那么我们只需与上一个数(0x55555555) <==> 1010101010101010101010101010101,如果得到的数还是其本身,则可以肯定其为4的次方数,。
class Solution { //2ms
public boolean isPowerOfFour(int num) {
return num > 0 && (num & (num - 1)) == 0 && (num & 0x55555555) == num;
}
}
④ 在确定是2的次方数了之后,发现只要是4的次方数,减1之后可以被3整除。
class Solution { // 3ms
public boolean isPowerOfFour(int num) {
return num > 0 && (num & (num - 1)) == 0 && ((num - 1) % 3) == 0;
}
}