一、题目
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1
输出: true
解释: 20 = 1
示例 2:
输入: 16
输出: true
解释: 24 = 16
示例 3:
输入: 218
输出: false
二、解决
1、直接调用
版本1:库函数
思路: 直接看代码。
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && Integer.bitCount(n) == 1;
}
}
时间复杂度:
O
(
1
)
O(1)
O(1)
空间复杂度:
O
(
1
)
O(1)
O(1)
版本2:Set判断
思路: 直接看代码。
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
return new HashSet<>(Arrays.asList(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608,16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824)).contains(n);
}
}
时间复杂度:
O
(
1
)
O(1)
O(1)
空间复杂度:
O
(
1
)
O(1)
O(1)
2、暴力
思路:
对整数不断除2,结果对2求余判断是否等于0,等于则说明还是2的倍数,继续除;不等于则跳出循环,判断最后是否为1,是---->则说明n是2的倍数;不是---->则说明不是2的倍数。
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
if (n <= 0) return false;
while (n%2 == 0) n/=2;
return n == 1;
}
}
时间复杂度:
O
(
l
o
g
2
n
)
O(log_2n)
O(log2n)
空间复杂度:
O
(
1
)
O(1)
O(1)
3、求余判零
思路:
因为
2
30
=
2
k
∗
(
2
30
−
k
)
2^{30}=2^k*(2^{30-k})
230=2k∗(230−k)。
若
n
=
2
k
n=2^k
n=2k,则
(
2
30
%
n
)
=
=
0
(2^{30}\%n) ==0
(230%n)==0,则说明n是2的幂;
若
(
2
30
%
n
)
!
=
0
(2^{30}\%n) !=0
(230%n)!=0, 做说明该数不是2的幂。
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (1073741824 % n == 0);
}
}
时间复杂度:
O
(
1
)
O(1)
O(1)
空间复杂度:
O
(
1
)
O(1)
O(1)
4、位运算
思路:
因为n是2的幂,则其二进制只有一个1。 n & ( n − 1 ) n \& (n-1) n&(n−1) 作用是消除最后一个1,如果消除后为0,则说明只有一个1,n是2的幂。
代码:
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && ((n & (n-1)) == 0);
}
}
时间复杂度:
O
(
1
)
O(1)
O(1)
空间复杂度:
O
(
1
)
O(1)
O(1)
三、参考
1、4 different ways to solve – Iterative / Recursive / Bit operation / Math