leetcode 342: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;
    }
}

妙啊,都给官方妙完了。方法二这谁能想得到啊?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值