Lc0231

05 August 2008

231 - Power of Two

原题概述

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

Example 1:

1
2
3
Input: 1
Output: true 
Explanation: 20 = 1

Example 2:

1
2
3
Input: 16
Output: true
Explanation: 24 = 16

Example 3:

1
2
Input: 218
Output: false

题意和分析

判断一个是否是2的幂,这道题自然可以用recursive或者iterative来做(O(log n)),

也可以用n & (n - 1),

因此我们看出,如果n是2的方幂,二者刚好位数全部不一样,那么做与操作n & (n-1) == 0b0000…0000 == 0;

否则比如 n =14 = 0b0000…1110, and (n - 1) = 13 = 0b0000…1101,n & (n-1) == 0b0000…1100 != 0.

另外n当然不能是0或负数。

Time O(1) :Space:O(1);

代码

迭代

1
2
3
4
5
6
7
8
9
10
11
class Solution {
    public boolean isPowerOfTwo(int n) {
        if (n <= 0) {
            return false;
        }
        while (n % 2 == 0) {
            n /= 2;
        }
        return n == 1;
    }
}

递归

1
2
3
4
5
6
7
8
9
10
11
class Solution {
    public boolean isPowerOfTwo(int n) {
        if (n == 1) {
            return true;
        } else if (n <= 0 || n % 2 != 0) {
            return false;
        } else {
            return isPowerOfTwo(n / 2);
        }
    }
}

若 n = 2^x,且 x 为自然数(即 n 为 2 的幂),则一定满足以下条件:

恒有 n & (n - 1) == 0,这是因为:

因此,通过 n > 0 且 n & (n - 1) == 0 即可判定是否满足 n = 2^x。

1
2
3
4
5
class Solution {
    public boolean isPowerOfTwo(int n) {
        return n > 0 && ((n & (n - 1)) == 0);
    }
}