leetcode 324:4的幂
作者:互联网
每日一题 我又来了
昨天是2的幂,果然今天还是和幂有关…
这里我提供三种解法,但都和官方解法不一样…
⊙方法一
class Solution {
public boolean isPowerOfFour(int n) {
if(n<=0){return false;}
int m = (int)Math.sqrt(n);
return (m &(m-1))==0 && (m * m)==n ;
}
}
思路就是把4的幂转化成2的幂,同时对两边开平方然后套用2的幂解法即可。唯一注意的点就是n开方后可能是个整数值也可能不是,这时要int强制转换,后面再判断m*m是否等于n即可(如果n开方后不是个整数那么后面的m * m == n就不成立)
⊙方法二
能是4的幂的数一定也满足是2的幂,而且在二进制表示中都只有一个1,不同的是4的幂的二进制表示中1的位置更特殊:1的后面只有偶数个0
那么想到这里,对于拿0的个数做文章显然有些蠢…我们已经找到了2的幂与4的幂二进制形式的不同点,应该在奇数位的位置做文章,用来排除那些是2的幂但又不是4的幂的数。
所以根据题目构造出奇数都为1的二进制数
10101010101010101010101010101010 (题目限制n <= 2^31-1)
但是!!!
他说这个太长了(用101010那种格式也是不行),于是缩短一半后成功了…离谱…
class Solution {
public boolean isPowerOfFour(int n) {
if(n <= 0) {return false;}
return (n&(n-1))==0 && ((n & 0xaaaaaaaa) == 0);
}
}
⊙方法三 (没脑子解法)
class Solution {
public boolean isPowerOfFour(int n) {
if(n <= 0){return false;}
while(n != 1){
if((n % 4) != 0){return false;}
n = n / 4;
}
return true;
}
}
官方正解
方法一
class Solution {
public boolean isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0xaaaaaaaa) == 0;
}
}
方法二
class Solution {
public boolean isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
}
}
妙啊,都给官方妙完了。方法二这谁能想得到啊?
标签:return,324,int,public,boolean,isPowerOfFour,&&,leetcode 来源: https://blog.csdn.net/weixin_49870878/article/details/117413669