leetcode-4的幂

342. 4的幂

使用数学方法

如果一个数是4的幂次方,那么它一定可以表示为2的幂次方乘以4的幂次方。而2的幂次方在二进制表示中只有一个1,所以只需要判断n是否可以被4整除,并且n/4是否也是4的幂次方即可。

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

也可以通过位运算来解决这个问题。如果一个数是4的幂次方,那么它的二进制表示中一定只有一位是1,其余位都是0。而这个1的位置一定是在奇数位上(从右往左数,最右边的位为第0位)。所以我们只需要判断这个数的二进制表示中是否只有一个1即可。

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

代码解释:

  • n > 0:确保n是正数,因为负数和0显然不是4的幂次方。
  • n & (n - 1) == 0:通过位运算判断n的二进制表示中是否只有一个1。如果n是2的幂次方,那么它的二进制表示中一定只有一个1,其余位都是0。而n-1则是将n的最低位的1变为0,并将所有更低的位变为1。所以,如果n是2的幂次方,那么n & (n - 1)的结果一定是0。
  • n & 0x55555555 == n:通过位运算判断n的二进制表示中1的位置是否在奇数位上。0x55555555是一个32位的数,其中所有奇数位都是1,偶数位都是0。如果n的二进制表示中1的位置在奇数位上,那么n & 0x55555555的结果一定等于n。

你可能感兴趣的:(leetcode)