LeetCode 342. 4的幂
题目描述
✅ 342. 4的幂

题意分析
判断给定的 32 位有符号整数是否等于
4^k,其中k为非负整数。4 的幂必须为正,1 对应k = 0,也应返回true;进阶要求不使用循环或递归。
解法:位运算判定
核心思路
[!blue]
因为 $4^k = 2^{2k}$,4 的幂在二进制中恰好只有一个
1,且这个1位于从 0 开始计数的偶数位。依次检查正数、只有一个1、该位位置正确这三个条件即可。对正整数,减一会把最低的
1变为0,并把它右侧的0变为1;再与原数按位与,恰好清除原数最低的那个1。因此n & (n - 1) == 0等价于原数只有一个1。必须先排除 0,因为 0 也会通过这个位运算判断。十六进制数字
5对应二进制0101,所以0x55555555的第0、2、4……30位为 1。已经确认n只有一个1后,n & 0x55555555 != 0就说明该位为偶数位。此时n = 2^(2k) = 4^k,三项条件既必要也充分,并且满足不用循环或递归的要求。
解题步骤
- 若
n <= 0,返回false。- 若
n & (n - 1)不为 0,说明有多个1,返回false。- 返回
n与偶数位掩码按位与的结果是否非零。
代码实现
class Solution {
public boolean isPowerOfFour(int n) {
if (n <= 0) {
return false;
}
// 清除最低一后必须归零,确保只有一个有效位
if ((n & (n - 1)) != 0) {
return false;
}
// 掩码只保留零基偶数位,进一步排除二的奇数次幂
return (n & 0x55555555) != 0;
}
}
func isPowerOfFour(n int) bool {
if n <= 0 {
return false
}
// 清除最低一后必须归零,确保只有一个有效位
if n&(n-1) != 0 {
return false
}
// 掩码只保留零基偶数位,进一步排除二的奇数次幂
return n&0x55555555 != 0
}
复杂度分析
- 时间复杂度:$O(1)$,固定次数的比较与位运算。
- 空间复杂度:$O(1)$。
关键点总结
[!green]
- 单一位与偶数位置是两个不同条件。
- 一对应四的零次幂,必须通过。
易错点总结
[!yellow]
- 只判断 2 的幂,会把唯一
1位于奇数位的数也接受。- 只检查偶数位掩码,无法排除多个
1的数。- 掩码改成
0xAAAAAAAA,检查的将是相反位置。
相似题目
| 题目 | 难度 | 关联与区别 |
|---|---|---|
| 231. 2 的幂 | 简单 | 先满足唯一一个二进制1,再要求该1位于偶数位位置,才能是4的幂。 |
| 326. 3 的幂 | 简单 | 同样判固定底数的幂,但3的幂不能利用本题的交替位掩码。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!