1 题目描述
2 解题思路
2.1 方法1 判断log函数的结果是不是整数
class Solution:
def isPowerOfFour(self, n: int) -> bool:
if(n<=0):
return False
tmp=math.log(n,4)
return(tmp==int(tmp))
2.2 方法2 不断除4
只要能被4整除,就不断除4,直到不能除为止,判断是否为1
class Solution:
def isPowerOfFour(self, n: int) -> bool:
if(n<=0):
return False
while(n%4==0):
n=n//4
return(n==1)
2.3 位运算
如果 n 是 4 的幂,那么 n 一定也是 2 的幂。
因此我们可以首先判断 n 是否是 2 的幂,在此基础上再判断 n 是否是 4 的幂。
判断 n 是否是 2 的幂可以参考文巾解题 231. 2的幂_刘文巾的博客-CSDN博客
如果 n 是 4 的幂,那么 n 的二进制表示中有且仅有一个 1,并且这个 1 出现在从低位开始的第偶数个二进制位上(这个 1 后面必须有偶数个 0)。这里我们规定最低位为第 0 位,例如 n=16 时,n 的二进制表示为(10000)。唯一的 1 出现在第 4 个二进制位上,因此 n 是 4 的幂。
由于题目保证了 n 是一个 32 位的有符号整数,因此我们可以构造一个整数 mask,它的所有偶数二进制位都是 1,所有奇数二进制位都是 0。这样一来,我们将 n 和mask 进行按位与运算,如果结果为 n,说明 n 二进制表示中的 1出现在偶数的位置,此时n是4的幂;否则说明其出现在奇数的位置。
根据上面的思路,mask 的二进制表示为0b1010101010101010101010101010101
class Solution:
def isPowerOfFour(self, n: int) -> bool:
if(n<=0):
return False
if(n&(n-1)!=0):
return False
#如果都不是2的幂,那么更不是4的幂
mask=0b1010101010101010101010101010101
if(n& mask==n):
return True
else:
return False
2.4 mod 3
如果 n 是 4 的幂,那么它可以表示成 的形式,我们可以发现它除以 3 的余数一定为 1,即:
如果n是2的幂,但不是4的幂,那么它可以表示成 的形式,此时它除以 3 的余数一定为 2。
class Solution:
def isPowerOfFour(self, n: int) -> bool:
if(n<=0):
return False
if(n&(n-1)!=0):
return False
#如果都不是2的幂,那么更不是4的幂
if(n%3==1):
return True
return False