代码仓库:Github | Leetcode solutions @doubleZ0108 from Peking University.
-
解法1(T37% S20%): 如果n是2的幂次方,则n对2取对数一定是整数,可再用2的乘方进行还原,如果取整 l o g 2 n log_2n log2n后计算 2 l o g 2 n 2^{log_2n} 2log2n与n不想等则n不是2的幂次方
- 注意负数和零一定不是2的幂次
-
解法2(T65% S39%): 不停的对n整除2,如果n始终对2取余为0,则是2的幂次方,否则不是
-
改进1(T85% S33%): 用位运算和移位运算替换取余和除法
while n != 1: if n & 1: return False # <=> n % 2 != 0 n >>= 1 # <=> n //= 2
-
-
解法3(T65% S66%): 幂运算,对于是2的幂次的数,其二进制一定只有最高位是1,其他均为0
return n>0 and not (n & (n-1))
class Solution(object):
def isPowerOfTwo(self, n):
"""
:type n: int
:rtype: bool
"""
# 解法1
if n<=0: return False
return pow(2, int(log(n,2))) == n
def otherSolution(self, n):
# 解法3
return n>0 and not (n & (n-1))
# 解法2
if n <= 0: return False
while n != 1:
# if n%2 != 0: return False
# n //= 2
# 改进1
if n & 1: return False
n >>= 1
return True