2 的幂
概述:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
输入:n = 1
输出:true
输入:n = 16
输出:true
输入:n = 3
输出:false
方法一:二进制(巧妙)
思路:此算法是一种非常讨巧的解法,二进制数只有最高位为 1 。
# 二进制(巧妙)
# 此算法是一种非常讨巧的解法,二进制数只有最高位为 1。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and bin(n).count('1') == 1
方法二:二进制
思路:用位运算把二进制中最低位的 1 提出来,然后判断即可。
# 二进制
# 用位运算把二进制中最低位的 1 提出来,然后判断即可。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and (n & (n - 1)) == 0
方法三:约数
思路:设定一个上限值,然后判断是否被约分即可。
# 约数
# 设定一个上限值,然后判断是否被约分即可。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and 2 ** 30 % n == 0
方法四:log方法
思路:调用 math.log2() 方法对 n 进行判断即可。
# log方法
# 调用 math.log2() 方法对 n 进行判断即可。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and math.log2(n) == int(math.log2(n))
方法五:递归
思路:设定好边界条件,然后依次递归到最小值,判断即可。
# 递归
# 设定好边界条件,然后依次递归到最小值,判断即可。
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n < 1:
return False
while n != 1:
if n % 2 == 1:
return False
n /= 2
return True
总结
别跟我说什么技巧,直接递归就完事了!