【位运算-简单】342. 4的幂

本文探讨如何使用Python编写高效的函数来检测一个整数是否是4的幂,通过位运算、数学原理和不使用循环的方法,提供多种实现策略并解析其原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】
给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x
【示例 1】
输入:n = 16
输出:true
【示例 2】
输入:n = 5
输出:false
【示例 3】
输入:n = 1
输出:true
【提示】
-231 <= n <= 231 - 1
【进阶】
你能不使用循环或者递归来完成本题吗?
【代码】
【Python】
执行用时:
44 ms, 在所有 Python3 提交中击败了47.29%的用户
内存消耗:
14.8 MB, 在所有 Python3 提交中击败了32.64%的用户

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        if n<=0:
            return False
        s=bin(n)[2:]
        t=s.count('0')
        y=s.count("1")
        return n==1 or (t%2==0 and t!=0 and y==1)

【方法2】
执行用时:
40 ms, 在所有 Python3 提交中击败了71.07%的用户
内存消耗:
14.7 MB, 在所有 Python3 提交中击败了86.44%的用户

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        if n<=0:
            return False
        s=bin(n)[2:]
        dic=dict(Counter(s))
        return  dic['1']==1 and dic.setdefault('0',0)%2==0

【方法3:预计算】
在这里插入图片描述

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        rs=[1,4,16,64,256,1024,4096,16384,65536,262144,1048576,4194304,16777216,67108864,268435456,1073741824]
        return n in rs

【方法4:数学法】
在这里插入图片描述

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n>0 and log2(n)%2==0

【方法5:位运算

  • 我们首先检查 num 是否为 2 的幂:x > 0 and x & (x - 1) == 0
  • 现在的问题是区分 2 的偶数幂(当 xx 是 4 的幂时)和 2 的奇数幂(当 xx 不是 4 的幂时)。在二进制表示中,这两种情况都只有一位为 1,其余为 0。
  • 在第一种情况下(4 的幂),1 处于偶数位置:第 0 位、第 2 位、第 4 位等;在第二种情况下,1 处于奇数位置。
  • 因此 4 的幂与数字 (101010…10)2向与会得到 0。即 4a(101010…10)2 == 0,4a ∧(101010…10) 2 ==0。
  • (101010…10) 2用十六进制表示为 :(aaaaaaaa)16
    在这里插入图片描述
    在这里插入图片描述
class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n>0 and n&(n-1)==0 and n&0xaaaaaaaa==0

【方法6:位运算+数学运算】

  • 首先先计算n是否是2的x次幂,n&(n-1)==0
  • n=2a 这时候有两种情况,a为偶数,a为奇数,若n为4的幂,则a为偶数
  • 当a=2x的时候,22x mod 3=4x mod 3=((3+1)x mod 3)=1
  • 当a=2x+1的时候,22x+1 mod 3=(2 * 4x mod 3)=(2*(3+1)x mod 3)=2
  • 综上所述:当n是2的幂,且n mod 3==1的时候,n是4的幂
    在这里插入图片描述
class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n>0 and n&(n-1)==0 and n%3==1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值