231. Power of Two

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

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

先吐槽下,我就是觉得简单,结果太大意了,忽略了0不是2的幂次方,1是2的幂次方(0次方),提交了三次才通过。。。我自己的算法是Olg(n)的,主要介绍下大神们时间复杂度O(1)的算法

解法一

return n>0 && ((n & (n-1)) == 0);
大神给出了解释:

如果n是2的幂次方,则n & (n-1) == 0b0000...0000 == 0,如下是例子可自行验证:

  • n = 2 ^ 0 = 1 = 0b0000...00000001, and (n - 1) = 0 = 0b0000...0000.
  • n = 2 ^ 1 = 2 = 0b0000...00000010, and (n - 1) = 1 = 0b0000...0001.
  • n = 2 ^ 2 = 4 = 0b0000...00000100, and (n - 1) = 3 = 0b0000...0011.
  • n = 2 ^ 3 = 8 = 0b0000...00001000, and (n - 1) = 7 = 0b0000...0111.

若n不是2的幂次方, n & (n-1) != 0.如下是例子

n =14 = 0b0000...1110, and (n - 1) = 13 = 0b0000...1101.

所以

return n>0 && ((n & (n-1)) == 0);

解法二

qxx

该解法和解法一有点像,利用了java的bitcount()函数,该函数返回n对应的二进制中有几个1。如果是2的幂次方,则该数转换为二进制包含且只包含一个1.

public class Solution {
    public boolean isPowerOfTwo(int n) {
        return n>0 && Integer.bitCount(n) == 1;
    }
}
解法三

motorix

integer的范围是 -2147483648 (-2^31) ~ 2147483647 (2^31-1), 2的幂次方可能的最大值为2^30 = 1073741824.

(1) 如果n是2的幂次方,假设n = 2^k, 其中k是整数.

那么2^30 = (2^k) * 2^(30-k), 也就是 (2^30 % 2^k) == 0.

(2) 如果n不是2的幂次方 , 假设n = j*(2^k), 其中k为整数,j是奇数。

那么(2^30 % j*(2^k)) == (2^(30-k) % j) != 0.

所以代码如下:

return n>0 && (1073741824 % n == 0);

时间复杂度 O(1)


就问你服不服。。。







猜你喜欢

转载自blog.csdn.net/weixin_39525565/article/details/80163892
今日推荐