java数据结构与算法刷题-----LeetCode342. 4的幂

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

在这里插入图片描述

位运算

解题思路:时间复杂度O( 1 1 1),空间复杂度O( 1 1 1)
  1. 4的幂,一定是2的幂,所以它具备2的幂的性质,二进制中只有1个1
  2. 因此使用和2的幂一样的方法,请参考
🏆LeetCode231:2 的幂(位运算,2的幂满足(n & -n) == n; (n & (n-1)) == 0;)https://blog.csdn.net/grd_java/article/details/125972618
  1. 但是4的幂还有额外的条件,我们观察4的幂的形式
  1. 4 0 = 1 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0001 4^0 = 1 = 0000,0000,0000,0000,0000,0000,0000,0001 40=1=0000,0000,0000,0000,0000,0000,0000,0001
  2. 4 1 = 4 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0100 4^1 = 4 = 0000,0000,0000,0000,0000,0000,0000,0100 41=4=0000,0000,0000,0000,0000,0000,0000,0100
  3. 4 2 = 16 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0001 , 0000 4^2 =16= 0000,0000,0000,0000,0000,0000,0001,0000 42=16=0000,0000,0000,0000,0000,0000,0001,0000
  4. 4 3 = 64 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0100 , 0000 4^3 =64= 0000,0000,0000,0000,0000,0000,0100,0000 43=64=0000,0000,0000,0000,0000,0000,0100,0000
  1. 我们发现每个1都出现在了偶数位置上[…,7位置,6位置,5位置,4位置,3位置,2位置,1位置,0位置]
  1. 4 0 = 1 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0001 4^0 = 1 = 0000,0000,0000,0000,0000,0000,0000,0001 40=1=0000,0000,0000,0000,0000,0000,0000,0001中的1出现在0位置
  2. 4 1 = 4 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0100 4^1 = 4 = 0000,0000,0000,0000,0000,0000,0000,0100 41=4=0000,0000,0000,0000,0000,0000,0000,0100中的1出现在2位置
  3. 4 2 = 16 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0001 , 0000 4^2 =16= 0000,0000,0000,0000,0000,0000,0001,0000 42=16=0000,0000,0000,0000,0000,0000,0001,0000中的1出现在4位置
  4. 4 3 = 64 = 0000 , 0000 , 0000 , 0000 , 0000 , 0000 , 0100 , 0000 4^3 =64= 0000,0000,0000,0000,0000,0000,0100,0000 43=64=0000,0000,0000,0000,0000,0000,0100,0000中的1出现在6位置
  1. 因此,我们需要额外在2的幂的基础上,加一条规则,那就是n的二进制串中的1,是否在偶数位置上。
  1. 我们将奇数位置标识出来:(10101010101010101010101010101010)二进制中,只对奇数位置操作
  2. 当然如果转换为16进制,它会比较好看一点:其16进制形式为0xaaaaaaaa
  3. 如果n&0xaaaaaaaa ==0,就说明n的二进制中的1,只出现在偶数位置上。因为如果出现在奇数位置上,两个二进制为都是1,与操作过后的结果一定也是1.
  4. 当然我们可以标识偶数位置(01010101010101010101010101010101) = 0x55555555
  5. 如果n& 0x55555555 = n的话,就说明n中1的位置正好在偶数位置上
代码
  1. 将n的二进制串,取出末位1,剩下的二进制串结果为0,就说明是2的幂。然后判断n&0xaaaaaaaa是否为0,来判断其中1的位置是否在偶数位置上

在这里插入图片描述

class Solution {
    public boolean isPowerOfFour(int n) {
        //(10101010101010101010101010101010)二进制中,只对奇数位置操作的辅助二进制串,其16进制形式为0xaaaaaaaa
        return n > 0 && //4的幂必然是正数
               (n & (n-1)) == 0 && //4的幂一定也是2的幂,2的幂的性质是,二进制中只有1个1
               (n & 0xaaaaaaaa) == 0; //4的幂有另一个性质,二进制中1的位置必然出现在偶数位置上(...2位置,1位置,0位置)
    }
}
  1. 只取出n的二进制中末位的1,如果取出的1的十进制和n的十进制相同,说明n是2的幂(二进制中只有1个1)。然后通过判断是否n& 0x55555555 == n,来确定n的二进制中的1是否只出现在偶数位置上
    在这里插入图片描述
class Solution {
    public boolean isPowerOfFour(int n) {
        //(10101010101010101010101010101010)二进制中,只对奇数位置操作的辅助二进制串,其16进制形式为0xaaaaaaaa
        //(01010101010101010101010101010101) = 0x55555555是只对偶数位置操作的辅助二进制串
        return n > 0 && //4的幂必然是正数
               (n & (-n)) == n && //4的幂一定也是2的幂,2的幂的性质是,二进制中只有1个1
               (n & 0x55555555) == n; //4的幂有另一个性质,二进制中1的位置必然出现在偶数位置上(...2位置,1位置,0位置)
    }
}
  • 34
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

殷丿grd_志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值