LeetCode231:2的幂

题目说明

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:

输入: 1
输出: true
解释: 2 0 = 1 2^0=1 20=1

示例 2:

输入: 16
输出: true
解释: 2 4 = 16 2^4=16 24=16

示例 3:

输入: 218
输出: false

题目分析

一开始也是用最简单传统的思维,用while来一直对 n n n进行2除(代码1),但是执行到最后是超出时间限制的。然后用用同样的方法,但是用递归(代码2),便可以得到结果。
但其实网上更多的解决办法是利用位运算,所以这里总结出规律就是一旦涉及到数字的运算,便要考虑是否能使用与& / 或|
代码3)中利用到的就是下面的规律啦~

1: 1
2: 10
4: 100
8: 1000
16: 10000

显然,每一个符合2的幂的数的二进制都只有一个1,因此我们可以对二进制进行求和,最终结果为1,即证明它为2的幂。
这里还可以有另一种运算(代码4),也即将这个数n减去1,变成:

1-1: 0
2-1: 01
4-1: 011
8-1: 0111
16-1: 01111

然后再将它和原来的数进行 & 运算,如果是2的幂,则最终结果一般为0。

代码1

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

代码2

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

代码3

class Solution {
public:
    bool isPowerOfTwo(int n) { 
        int sum=0;
        while(n > 0) {
            sum += (n&1);
            n = n>>1;
        }
        if(sum == 1) {
            return true;
        } else {
            return false;
        }
    }
};

代码4

class Solution {
public:
    bool isPowerOfTwo(int n) { 
        if(n <= 0) return false;
        else
            return (n&(n-1)) == 0 ? true : false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值