【题目】
给定一个整数,写一个函数来判断它是否是 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