题目描述
原题链接:4的幂
思路
方法一 暴力
1、从头开始计算,每次乘以4,直到变量的值大于等于4,
2、如果等于4返回true,否则返回false;
显然超时了…
代码
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0) return false;
int i=1;
while(i<n){
i=i*4;
}
if(i==n){
return true;
}else{
return false;
}
}
}
方法二 打表
打表:
提前写一个函数计算所有范围内的4的幂,最后算出来有16个,然后存储起来,每次判断n有没有出现在表中即可。
代码
class Solution {
public boolean isPowerOfFour(int n) {
//打表,提前计算出4的幂
int[] target={1, 4, 16, 64, 256, 1024, 4096, 16384, 65536, 262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824};
for(int i=0;i<target.length;i++){
if(target[i]==n){
return true;
}
}
return false;
}
}
这个代码不需要提交
public class Main{
public static void main(String[] args) {
//统计4的幂
long n=1;
LinkedList<Long> list=new LinkedList<>();
while(n<Integer.MAX_VALUE){
list.add(n);
n=n*4;
}
System.out.println(list.size());
System.out.println(list);
}
}
方法三 位运算
⭐首先用位运算检查它是不是2的幂,具体方法看昨天的题:2的幂
⭐4的幂也是2的幂,但与2的幂的区别是:4的幂在二进制表示下只有一个1且这个1只出现在奇数位上
⭐所以可以设法校验该数的“1”在奇数位还是在偶数位,具体方法如下:
⭐思想:消除掉奇数位上的0,然后检验结果是不是0,若是0,说明它的“1”在奇数位上,被消掉了,那它就是4的幂;若它不是0,说明“1”在偶数位上,那它就不是4的幂。
实现:让待检测数与0x55555555做与运算,实现将待检测数偶数位上的1去除
0x55555555表示这是一个16进制的数,转化为2进制是这样的:010101010101…一共32位,32位是因为-231 <= n <= 231 - 1
代码
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0) return false;
//首先判断它是不是2的幂
if((n&(n-1))==0){
//进一步判断它是不是4的幂
return (n&0x55555555)!=0;
}
return false;
}
}