一、题目
1、题目描述
给你一个整数
n
,请你判断该整数是否是 2 2 2 的幂次方。如果是,返回true
;否则,返回false
。如果存在一个整数x
使得 n = = 2 x n == 2^x n==2x ,则认为n
是 2 2 2 的幂次方。
2、基础框架
class Solution {
public boolean isPowerOfTwo(int n) {
}
}
3、原题链接
二、解题报告
1、位运算
1.1 思路分析
(
1
)
(1)
(1)
2
2
2 的幂次在二进制中只有一个
1
1
1,前后其它位都为0;因而可以通过位运算将
1
1
1 提取出来,然后判断其它位是否为零即可。
(
2
)
(2)
(2) 二进制减法和十进制并无太大差别,当
n
−
1
n - 1
n−1 时,二进制表示中有
1
1
1 的最低位变为
0
0
0,最低位之后变为
1
1
1;而
2
2
2 次幂的二进制表示中只有一位
1
1
1,因而若
n
n
n 为正整数且满足
n
&
(
n
−
1
)
=
0
n \& (n - 1) = 0
n&(n−1)=0 ,
n
n
n 即为
2
2
2 次幂。
1.2 复杂度分析
空间复杂度:
O
(
1
)
O(1)
O(1)
时间复杂度:
O
(
1
)
O(1)
O(1)
1.3 代码详解
class Solution {
public boolean isPowerOfTwo(int n) {
if(n <= 0){
return false;
}
return (n & (n - 1)) == 0 ? true : false;
}
}
2、对数法
2.1 思路分析
(
1
)
(1)
(1) 利用对数公式
log
n
log
2
=
log
2
n
\frac{\log{n}} {\log{2}} = \log_2{n}
log2logn=log2n 计算得出
2
2
2 对于
n
n
n 的幂次,再判断结果是否为整数。
(
2
)
(2)
(2) 但是需要考虑的是,就算
n
n
n 是
2
2
2 的整数次幂,计算结果也不会是绝对精度上的整数;因此要根据不同编程语言的精度,取一个足够小的值来判断计算结果是否为整数。
2.2 复杂度分析
空间复杂度:
O
(
1
)
O(1)
O(1)。
时间复杂度:
O
(
1
)
O(1)
O(1)。
2.3 代码详解
class Solution {
public boolean isPowerOfTwo(int n) {
double power = Math.log(n) / Math.log(2);
return Math.abs(power - Math.round(power)) < Math.pow(10,-14);
}
}