Easy
题目描述
给定一个整数 n,如果它是 4 的幂次方,则返回 true;否则,返回 false。
如果存在一个整数 x 使得 n == 4^x,则认为 n 是 4 的幂次方。
示例 1:
输入:n = 16
输出:true
示例 2:
输入:n = 5
输出:false
示例 3:
输入:n = 1
输出:true
约束条件:
-2^31 <= n <= 2^31 - 1
进阶: 你能不使用循环或者递归来解决这个问题吗?
解题思路
这道题要判断一个数是否为 4 的幂次方,有三种常见的解法:
解法一:暴力法
通过循环不断除以 4,如果最终结果为 1 则是 4 的幂次方。需要注意处理负数和 0 的情况。
解法二:递归法
利用递归的思想,如果 n % 4 == 0,则递归检查 n / 4,递归终止条件是 n == 1。
解法三:位运算法(最优)
4 的幂次方有特殊的二进制模式:
- 首先必须是 2 的幂次方,即
n > 0 && (n & (n-1)) == 0 - 4 的幂次方的二进制中,1 只能出现在偶数位置上(从右往左数,位置从 0 开始)
- 可以用掩码
0x55555555(二进制为 01010101…)来检查 1 是否在正确位置
位运算解法的核心思想:4 的幂次方 = 2^(2k),即指数必须是偶数。在二进制表示中,这意味着唯一的 1 位必须在偶数位置。
推荐使用位运算解法,因为它时间复杂度为 O(1),且符合进阶要求。
代码实现
class Solution {
public:
bool isPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
}
};
class Solution:
def isPowerOfFour(self, n: int) -> bool:
return n > 0 and (n & (n - 1)) == 0 and (n & 0x55555555) != 0
public class Solution {
public bool IsPowerOfFour(int n) {
return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
}
}
var isPowerOfFour = function(n) {
return n > 0 && (n & (n - 1)) === 0 && (n & 0x55555555) !== 0;
};
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 暴力循环法 | O(log n) | O(1) |
| 递归法 | O(log n) | O(log n) |
| 位运算法 | O(1) | O(1) |
相关题目
. Power of Two (Easy)
. Power of Three (Easy)