您的位置:首页 > 其它

231. Power of Two

2016-06-18 15:59 239 查看
题目:

Given an integer, write a function to determine if it is a power of two.

题意:

给定一个整数,写一个程序检测该整数是否是2的幂。

思路一:

最直接的方法就是不停地除以2,看最后的余数是否为1,要注意考虑输入是负数和0的情况。

代码:递归版:8ms

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n>0 && (n==1 || (n%2==0 && isPowerOfTwo(n/2)));
    }
};
代码:轮询版:8ms

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


思路二:

观察下2的次方数的二进制写法的特点:

1     2       4         8         16   ....

1    10    100    1000    10000 ....

那么我们很容易看出来2的次方数都只有一个1,剩下的都是0,所以我们的解题思路就有了,我们只要每次判断最低位是否为1,然后向右移位,最后统计1的个数即可判断是否是2的次方数。

代码:8ms

class Solution {
public:
    bool isPowerOfTwo(int n) {
        int count = 0;
        while(n>0){
            count += (n&1);
            n >>= 1;
        }
        return count==1;
    }
};


思路三:

这道题还有一个技巧,如果一个数是2的次方数的话,根据上面分析,那么它的二进数必然是最高位为1,其它都为0,那么如果此时我们减1的话,则最高位会降一位,其余为0的位现在都为变为1,那么我们把两数相与,就会得到0,用这个性质也能来解题,而且只需一行代码就可以搞定。

代码:9ms

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return (n>0) && (!(n&(n-1)));
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: