题目
给你一个整数 n
,请你判断该整数是否是 2
的幂次方。如果是,返回 true
;否则,返回 false
。
如果存在一个整数 x
使得 n == 2x
,则认为 n
是 2
的幂次方。
解题思路
常规思路就是判断 n
对应的二进制数除了首位是 1
其余的位置是否全是 0
,即对应的二进制只有一个 1
,需要用到循环处理,但这显然不是面试官想要的结果。
非常规的思路是,如果 n
是 2
的幂,那么 n
的二进制是除了首位是 1
其余的位置全是 0
, n-1
的二进制全是 1
,那么将二者做与运算,就能判断 n
的二进制除了首位其他的位置是否还有 1
,如果有那么结果就不为 0
。
还有一种取巧的思路,用该范围内最大的 2
的幂去对 n
取余,夺笋呐,代码就懒得附上了。
代码
/* 常规思路 */
class Solution {
public boolean isPowerOfTwo(int n) {
if (n <= 0) return false;
while (n != 0) {
if (n % 2 == 1 && n != 1) return false;
n /= 2;
}
return true;
}
}
/* 非常规思路 */
class Solution {
public boolean isPowerOfTwo(int n) {
if (n <= 0) return false;
if ((n & (n - 1)) == 0) return true;
else return false;
}
}