LeetCode 342. 4的幂

这篇博客分享了如何判断一个整数是否为4的幂的多种方法,包括递归和位运算。作者提供了详细的代码实现,并解释了2的幂与4的幂之间的关系,通过位操作优化了判断过程。最后,文章提出了一种简洁的解决方案,通过检查数字减一后能否被3整除来排除非4的幂的情况。

截止到目前我已经写了 600多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666

在这里插入图片描述
在这里插入图片描述

public boolean isPowerOfFour(int num) {
    //负数不可能是4的幂
    if (num <= 0)
        return false;
    //1是4的0次幂
    if (num == 1)
        return true;
    //如果不能够被4整除,肯定不是4的幂
    if (num % 4 != 0)
        return false;
    //如果能被4整除,除以4然后递归调用
    return isPowerOfFour(num / 4);
}

当然还可以一行代码搞定,但这种可读性不是太好

public boolean isPowerOfFour(int num) {
    return num > 0 && (num == 1 || (num % 4 == 0 && isPowerOfFour(num / 4)));
}

在这里插入图片描述
通过上面我们可以看到如果一个数是2的幂,并且二进制从右边数奇数位是1的一定是4的幂。判断是2的幂,我们只需要判断二进制中1的个数即可,这里可以参照425,剑指 Offer-二进制中1的个数,实际上还有一种更简单的方式,就是判断(num & (num - 1)) == 0,并且还要保证num>0;

最终代码如下

public boolean isPowerOfFour(int num) {
    return num > 0 && (num & (num - 1)) == 0 && (num & 0x55555555) == num;
}

注意这里0x55555555的二进制是

01010101 01010101 01010101 01010101

实际上还可以换一种方式

public boolean isPowerOfFour(int num) {
    return num > 0 && ((num & (num - 1)) == 0) && (num & 0xaaaaaaaa) == 0;
}

这里0xaaaaaaaa的二进制是

10101010 10101010 10101010 10101010

在这里插入图片描述

public boolean isPowerOfFour(int num) {
    return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0;
}

有没有一种可能就是一个数num是2的幂,但不是4的幂而且减去1还能被3整除呢,其实是没有这种可能的,如果一个数是2的幂但不是4的幂,那么这个数一定是2的奇次幂,类似于2^(2k+1),我们来证明一下
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据结构和算法

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

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

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

打赏作者

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

抵扣说明:

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

余额充值