【简单】力扣算法题解析LeetCode342:4的幂

关注底部名片达文汐,即可获得本题完整源码

题目来源:LeetCode 342: 4的幂

问题抽象: 给定一个整数 n(32 位有符号整数),判断其是否为 4 的幂(即存在整数 k 使得 4^k = n)。

  1. 核心需求

    • 返回布尔值 true 当且仅当 n 可表示为 4 的整数次幂;
    • 需处理 正数、零、负数
      • 负数直接判否(因 4^k>0);
      • 零判否(4^k 恒为正)。
  2. 数学条件

    • 必要条件n 必须是 正数 且为 2 的幂(即 n > 0n & (n-1) == 0);
    • 充分条件:在满足必要条件的基础上,n 的唯一二进制位 1 必须位于 偶数索引位(最低位索引为 0,如 1 (0b1) 的索引为 04 (0b100) 的索引为 2)。
  3. 边界处理

    • n=1 返回 true4^0=1);
    • n=0 或负数返回 false
    • 最大 4 的幂在 2^31 范围内:4^15 = 1073741824 为有效值,4^16 超出 2^31-1 故不在输入范围内。
  4. 特殊案例验证

    • n=164^2=16)→ true0b100001 位于索引 4 偶数位);
    • n=82^3)→ false(虽是 2 的幂但 1 位于索引 3 奇数位);
    • n=5false(非 2 的幂)。

输入:整数 n(值域 [-2^31, 2^31-1]
输出:布尔值(true 表示 n4 的幂,否则 false)。


解题思路

要判断一个整数是否为4的幂,需要满足以下条件:

  1. 必须是正数:4的幂都是正整数(n > 0)。
  2. 必须是2的幂:4的幂首先是2的幂,满足 (n & (n-1)) == 0(二进制中只有1个1)。
  3. 1必须出现在奇数位:4的幂的二进制表示中,1的位置只出现在从低位开始的第1、3、5…等奇数位上。通过掩码 0x55555555(二进制01010101010101010101010101010101)检查:(n & 0x55555555) != 0

为什么用掩码0x55555555?
该掩码确保n的二进制表示中,1的位置落在奇数位。例如:

  • 4¹ = 4 → 100(第3位,符合)
  • 4² = 16 → 10000(第5位,符合)
  • 非4的幂(如8=1000)在第4位(偶数位),会被掩码过滤。

代码实现(Java版)🔥点击下载源码

class Solution {
    public boolean isPowerOfFour(int n) {
        // 条件1:n必须大于0(4的幂是正数)
        // 条件2:n是2的幂(二进制中只有1个1)
        // 条件3:n的二进制中1的位置在奇数位(通过掩码0x55555555验证)
        return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
    }
}

代码说明

  1. 时间复杂度:O(1),只有位运算操作。
  2. 空间复杂度:O(1),未使用额外空间。
  3. 关键操作
    • n > 0:排除负数和0。
    • (n & (n-1)) == 0:确保n是2的幂(二进制中仅1个1)。
    • (n & 0x55555555) != 0:确保1出现在奇数位(掩码设计见解题思路)。
  4. 优势:位运算直接操作二进制,效率最高,且无循环/递归。

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

在这里插入图片描述

我的名片👇👇👇👇👇👇👇👇👇👇👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值