【位运算】力扣342:4的幂

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。
整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4^x。
提示:231<=n<=2311
示例:

输入:n = 16
输出:true

方法1:循环

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        if n < 1: # 负数和0都不是4的幂
            return False
        while n != 1:
            if n % 4 != 0:
                return False
            n //= 4
        return True

方法2:递归
建立在方法1的基础上

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        if n < 1:
            return False
        elif n == 1:
            return True
        elif n % 4 != 0:
            return False
        return self.isPowerOfFour(n//4)

因为4是2的幂,所以可以从二进制角度考虑:
思路1:考虑二进制表示中 1 和 0 的个数
4的幂必须满足:二进制中的 1 只有一个,并且 0 的个数是2的倍数,即:bin(n).count('1') == 1 and bin(n).count('0') % 2 == 1
由于二进制有前缀标识是 0b,所以结果 0 的个数会多一个标识 0,那么 0 的个数必须是奇数。例如:

n = 4
m = bin(n)
print(m, m.count('0'))

>> 0b100 3

那么代码为

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return bin(n).count('0') % 2 == 1 and bin(n).count('1') == 1 if n > 0 else False

思路2:先考虑 2 的幂
如果 n 是 4 的幂,那么 n 一定也是 2 的幂。因此可以首先判断 n 是否是 2 的幂,在此基础上再判断 n 是否是 4 的幂。
首先考虑一个数字是不是 2 的(整数)次方:如果一个正整数 n 是 2 的整数次方,那么它的二进制一定是 0...010...0(共32位) 这样的形式;考虑到 n − 1 的二进制是 0...001...1,这两个数求【按位与】的结果一定是 0。因此如果 n & (n - 1) 为 0,那么这个数是 2 的次方。
∴ 判断一个数 n 是否是 2 的幂的一种方法是:判断 n > 0 and (n & (n - 1)) == 0 的bool是否为true
方法4:考虑二进制表示中 1 的位置
如果这个数也是 4 的次方,那二进制表示中只有一个1,而且 1 的位置必须在奇数位。

  • 可以把 n 和二进制的 0b010101...10(所有偶数为为1,即十六进制下的0xaaaaaaaa)做按位与,如果结果为0,那么说明这个数是4的次方。
  • 可以把 n 和二进制的 0b10101...101(所有奇数位为1,即十进制下的 1431655765,十六进制下的 0x55555555)做按位与,如果结果不为 0,那么说明这个数是 4 的次方。
  1. 与所有偶数位为1的二进制数按位与
class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and (n & 0xaaaaaaaa) == 0
  1. 与所有奇数位为1的二进制数按位与
class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and (n & 0x55555555) == n

时间复杂度:O(1)。
空间复杂度:O(1)。

方法2:取模
如果 n 是 4 的幂,那么它可以表示成 4^x 的形式,我们可以发现它除以 3 的余数一定为 1。
如果 n 是 2 的幂却不是 4 的幂,那么它可以表示成 4^x × 2 的形式,此时它除以 3 的余数一定为 2。因此我们可以通过 n 除以 3 的余数是否为 1 来判断 n 是否是 4 的幂。

class Solution:
    def isPowerOfFour(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and n % 3 == 1

时间复杂度:O(1)。
空间复杂度:O(1)。

posted @   Vonos  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示