题目
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
解法
解法1
不做过多的判断, 对给定的 n
做除法运算或做右移运算
改进方法是对 n%2
判断是否为0,加上这个判断就可以大幅提升速度
如果不加的话,就等同于暴力解法了,直接超出时间限制
C实现
bool isPowerOfTwo(int n) {
if (n<=0)
return false;
while(n%2 == 0)
n /= 2;
return n==1;
}
解法2
递归解法与上面类似,返回语句上有差别,同样,在这里最重要的语句是if (n%2 ==1)
, 在Python实现中, 这条语句让时间消耗从 436ms 提升至 64ms 比较神奇的是, 递归和前面的非递归获得了相同的结果.
C实现
bool isPowerOfTwo(int n) {
if (n == 0)
return false;
if (n == 1)
return true;
if (n%2 ==1)
return false;
n = n/2;
return isPowerOfTwo(n);
}
Python实现
class Solution:
def isPowerOfTwo(self, n):
"""
:type n: int
:rtype: bool
"""
if n==0:
return False
if n==1:
return True
if n%2 == 1:
return False
n = n/2
return self.isPowerOfTwo(n)
解法3
解法3 来自评论区的大佬指点, 利用位运算去判断.
所有的 2^n 二进制写法均为 10......000 的形式, 而 2^n-1 都是 01....111的形式, 二者按位与, 结果必为 0
需要C语言中 &
与 二目运算符 ==
的运算优先级, 如果用 n & (n-1) == 1
的话, 结果是错的. BTW, 这种写法的速度也不如直接取反
C实现
bool isPowerOfTwo(int n) {
if (n<=0)
return false;
return !(n&(n-1));
}
Python实现
class Solution:
def isPowerOfTwo(self, n):
"""
:type n: int
:rtype: bool
"""
if n <= 0:
return False
return n&(n-1) == 0