声明:
今天是第77道题。给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
示例 1:
输入: 16 输出: true
示例 2:
输入: 5 输出: false
进阶:
你能不使用循环或者递归来完成本题吗?
解法1。用巧取的方式,但和上一节求3的幂不一样,因为要考虑到是4的幂一定是2的幂,所以要排除掉是2的幂但不是4的幂这些数判断逻辑就需要变化,必要条件见下,代码如下。
执行用时: 40 ms, 在Power of Four的Python提交中击败了19.17% 的用户
- 大于0
- 最高位是1(是4的幂,但也满足是2的幂)
- 0的个数是偶数个,1肯定在奇数位(这里代码中为什么用16进制的数表示?难道是因为相比于2进制,16进制能表示更大的数吗?)
class Solution(object):
def isPowerOfFour(self, num):
"""
:type num: int
:rtype: bool
"""
return num > 0 and num & (num-1) == 0 and num & 0x55555555 > 0
解法2。迭代
执行用时: 44 ms, 在Power of Four的Python提交中击败了10.83% 的用户
class Solution(object):
def isPowerOfFour(self, num):
"""
:type num: int
:rtype: bool
"""
while num % 4 == 0 and num >= 4:
num //= 4
return n == 1
解法3。递归
执行用时: 32 ms, 在Power of Four的Python提交中击败了80.00% 的用户
class Solution(object):
def isPowerOfFour(self,num):
if num < 4:
if num == 1:
return True
else:
return False
if num % 4 == 0 and num >= 4:
return self.isPowerOfFour(num/4)
else:
return False
结尾
解法1:LeetCode
解法2&解法3:原创