您的位置:首页 > 其它

2、3、4的幂

2016-05-13 23:21 281 查看
Given an integer (signed 32 bits), write a function to check whether it is a power of 2.

Example:

Given num = 16, return true. Given num = 5, return false.

Follow up: Could you solve it without loops/recursion? https://leetcode.com/problems/power-of-two/ https://leetcode.com/problems/power-of-three/
https://leetcode.com/problems/power-of-four/
常规解法:

直接进行除法运算,如果能整除,则返回真,否则返回假。

把M分别换成2,3,4,即可AC。

算法一:

class Solution {
public:
bool isPowerOfTwo(int n) {
const int M = 2;
if (n < 1)
return false;
if (n == 1)
return true;
while (n % M == 0 && n > M)
n /= M;
return n == M;
}
};

如果要求不要循环呢?
先看循环了多少次,对于32位整数,负数全部为false,正数部分,2的幂也就31个。4的幂也就15个,所以3的幂应该在16~30个(实际是20个)。

所以循环次数是很少的。

不循环就要分析数字特征了:

对于2,从二进制看,最小的是1,然后依次是2, 4, 8……也就是这个bit1不断移位,因此其二进制bit应该只有一个1,其他全零。

因此可以进行bit计数。只有1个就true,0个或者多个就是false。

其实这种方法仍然有循环,且次数固定为31次。相当于算法一的最坏情况。。。

还有一种考虑方法,由于只有一个bit是1,那么其减一后,bit为1的位一定和原来的bit不在相同的位置。

所以有算法二:

class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && !(n & (n - 1));
}
};

但是,对于3和4,不循环就没那么简单了。

从工程上说,由于数比较少,可以先计算一遍,保存起来,以后直接查表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode