【简单】力扣算法题解析LeetCode231:2 的幂
·
题目来源:LeetCode231:2 的幂
问题抽象: 判断一个整数是否为 2 的正整数次幂(即 n = 2k, k ∈ N ),需满足以下核心需求:
-
数学定义:
- 当且仅当存在整数 k ≥ 0 使得 n = 2k 时成立(如1 = 20, 2 = 21, 4 = 22);
- 负数和零均无效(如 n = -16, 0 返回
false)。
-
位运算约束:
- 禁止使用循环/递归(需通过 常数次位操作 完成);
- 核心性质:
- n > 0 且 二进制表示中仅含一个
1(如 8 = 0b1000,16 = 0b10000); - 利用 ( n & (n - 1) = 0 )(清除最低位
1后结果为0)。
- n > 0 且 二进制表示中仅含一个
-
边界处理:
- n = 1 :有效( 20 ),返回
true); - n = 0 :无效(返回
false); - 负数:直接无效(如 n = -8 ,返回
false); - 超大整数:需兼容 32 位有符号整数范围(-231 ≤ n ≤ 231-1 )。
- n = 1 :有效( 20 ),返回
输入:整数 n (32 位有符号整数)
输出:布尔值 true/false(表示是否为 2 的幂)
解题思路
要判断一个整数 n 是否是 2 的幂次方,可以利用二进制表示的特性:
- 2 的幂次方的二进制特征:其二进制形式有且仅有一个
1,其余位均为0。例如:1(2^0)的二进制:12(2^1)的二进制:104(2^2)的二进制:1008(2^3)的二进制:1000
- 关键操作:利用位运算
n & (n - 1):- 如果
n是 2 的幂次方,则n - 1的二进制会将n的最低位的1变为0,后续位变为1。此时n & (n - 1) = 0。 - 例如:
n = 4 (100),n - 1 = 3 (011),4 & 3 = 0。
- 如果
- 边界处理:
- 非正数(
n <= 0)直接排除,因为 2 的幂次方必须是正整数。 - 特殊处理
n = 1(2^0)符合条件。
- 非正数(
算法步骤:
- 若
n <= 0,返回false。 - 若
n & (n - 1) == 0,说明n是 2 的幂次方,返回true;否则返回false。
复杂度:
- 时间复杂度:
O(1),仅需一次位运算。 - 空间复杂度:
O(1),无额外空间。
代码实现(Java版)🔥点击下载源码
class Solution {
public boolean isPowerOfTwo(int n) {
// 排除非正整数,并利用位运算判断是否仅含一个二进制位1
return n > 0 && (n & (n - 1)) == 0;
}
}
代码说明
- 边界处理:
n > 0确保排除负数和零。 - 位运算:
(n & (n - 1)) == 0检测n的二进制是否仅含一个1:n - 1将最低位的1变为0,后续位变为1。- 按位与操作
n & (n - 1)会消除最低位的1,若结果为0则说明原数字只有一个1。
- 简洁性:单行返回结果,无循环或递归,满足进阶要求。
提交详情(执行用时、内存消耗)

更多推荐



所有评论(0)