1. 问题描述:
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/power-of-two
2. 思路分析:
① 一个比较容易想到的方法是使用一直除以2的方式来判断是否是2的幂次方,假如在整除的过程发现不是2的倍数那么肯定不是2的幂次方直接返回False即可,对于相同的问题的求解可以使用递归实现(也可以是使用循环来实现),我们在递归往下求解的过程中先判断出当前的n是否是2的倍数如果是才往下进行求解,当发现不是2的倍数的时候这个时候就会返回到上一层了,然后进行层层返回False(只要是求解过程中发现是False那么最终答案肯定是层层返回False的)。
② 除了使用递归的方法来进行求解的思路我们还可以使用位运算的方法进行求解,官方提供的解题思路中使用的就是位运算方法进行求解的,其中使用到了一个比较重要的判断表达式,x & -x == x,&进行按位与运算,会保存最右边的1,所以假如是2的幂次方那么肯定是只存在一个1的,不是则不止一个1,所以使用这个表达式进行判断即可求解,力扣题解。
③ 位运算中还要一个比较常用的判断是否是2的整数次幂的公式:x & (x - 1) == 0。
3. 代码如下:
递归:
class Solution:
def recursion(self, n: int):
if n == 1:
return True
return n % 2 == 0 and self.isPowerOfTwo(n // 2)
def isPowerOfTwo(self, n: int) -> bool:
# 只要是有一个条件不满足那么肯定是False的
if n == 0: return False
# 递归进行求解
return self.recursion(n)
if __name__ == '__main__':
print(Solution().isPowerOfTwo(256))
位运算:
class Solution:
def isPowerOfTwo(self, n):
if n == 0:
return False
return n & (-n) == n
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n & (n - 1) == 0