2、3、4的幂

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,不循环就没那么简单了。

从工程上说,由于数比较少,可以先计算一遍,保存起来,以后直接查表。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值