其他分享
首页 > 其他分享> > leetcode 324:4的幂

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