关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode231:2 的幂

问题抽象: 判断一个整数是否为 2 的正整数次幂(即 n = 2k, k ∈ N ),需满足以下核心需求:

  1. 数学定义

    • 当且仅当存在整数 k ≥ 0 使得 n = 2k 时成立(如1 = 20, 2 = 21, 4 = 22);
    • 负数和零均无效(如 n = -16, 0 返回 false)。
  2. 位运算约束

    • 禁止使用循环/递归(需通过 常数次位操作 完成);
    • 核心性质:
      • n > 0 且 二进制表示中仅含一个 1(如 8 = 0b1000,16 = 0b10000);
      • 利用 ( n & (n - 1) = 0 )(清除最低位 1 后结果为 0)。
  3. 边界处理

    • n = 1 :有效( 20 ),返回 true);
    • n = 0 :无效(返回 false);
    • 负数:直接无效(如 n = -8 ,返回 false);
    • 超大整数:需兼容 32 位有符号整数范围(-231 ≤ n ≤ 231-1 )。

输入:整数 n (32 位有符号整数)
输出:布尔值 true/false(表示是否为 2 的幂)


解题思路

要判断一个整数 n 是否是 2 的幂次方,可以利用二进制表示的特性:

  1. 2 的幂次方的二进制特征:其二进制形式有且仅有一个 1,其余位均为 0。例如:
    • 12^0)的二进制:1
    • 22^1)的二进制:10
    • 42^2)的二进制:100
    • 82^3)的二进制:1000
  2. 关键操作:利用位运算 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
  3. 边界处理
    • 非正数(n <= 0)直接排除,因为 2 的幂次方必须是正整数。
    • 特殊处理 n = 12^0)符合条件。

算法步骤

  1. n <= 0,返回 false
  2. 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;
    }
}

代码说明

  1. 边界处理n > 0 确保排除负数和零。
  2. 位运算(n & (n - 1)) == 0 检测 n 的二进制是否仅含一个 1
    • n - 1 将最低位的 1 变为 0,后续位变为 1
    • 按位与操作 n & (n - 1) 会消除最低位的 1,若结果为 0 则说明原数字只有一个 1
  3. 简洁性:单行返回结果,无循环或递归,满足进阶要求。

提交详情(执行用时、内存消耗)

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐