LeetCode第342题_4的幂

LeetCode 第342题:4的幂

📖 文章摘要

本文详细解析LeetCode第342题"4的幂",这是一道简单难度的数学题。文章提供了多种解法,包括循环、位运算和数学方法,包含C#、Python、C++三种语言实现,配有详细的算法分析和性能对比。适合想要提升数学思维和位运算能力的程序员。

核心知识点: 位运算、数学、循环
难度等级: 简单
推荐人群: 初学算法的程序员,想要提升数学思维的开发者

题目描述

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4^x

示例

示例 1:

输入:n = 16
输出:true

示例 2:

输入:n = 5
输出:false

示例 3:

输入:n = 1
输出:true

提示

  • -2^31 <= n <= 2^31 - 1

解题思路

方法一:循环除法

通过不断除以4来判断是否是4的幂。

关键点:

  • 首先判断是否为正数
  • 不断除以4直到不能整除
  • 最后判断是否为1

具体步骤:

  1. 判断n是否大于0
  2. 循环除以4直到不能整除
  3. 判断最后结果是否为1

时间复杂度:O(log n)
空间复杂度:O(1)

方法二:位运算

利用位运算的特性来判断。

关键点:

  • 4的幂一定是2的幂
  • 4的幂的1位于奇数位
  • 使用位掩码0x55555555

具体步骤:

  1. 判断是否为2的幂
  2. 判断1是否在正确的位置

时间复杂度:O(1)
空间复杂度:O(1)

方法三:数学方法

利用数学性质来判断。

关键点:

  • 4的幂减1是3的倍数
  • 同时必须是2的幂

图解思路

位运算分析表

数字二进制表示是否为4的幂原因
100014^0
401004^1
16100004^2
20010不是4的幂
81000不是4的幂

数学方法分析

4的幂的性质:
1 = 4^0 = 1      (1-1=0)
4 = 4^1 = 4      (4-1=3)
16 = 4^2 = 16    (16-1=15)
64 = 4^3 = 64    (64-1=63)
观察:4的幂减1都是3的倍数

代码实现

C# 实现

public class Solution {
    // 方法一:循环除法
    public bool IsPowerOfFour(int n) {
        if (n <= 0) return false;
        while (n % 4 == 0) {
            n /= 4;
        }
        return n == 1;
    }
    
    // 方法二:位运算
    public bool IsPowerOfFourBit(int n) {
        // 首先是2的幂,且1只出现在奇数位
        return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
    }
    
    // 方法三:数学方法
    public bool IsPowerOfFourMath(int n) {
        // 是2的幂且减1是3的倍数
        return n > 0 && (n & (n - 1)) == 0 && (n - 1) % 3 == 0;
    }
}

Python 实现

class Solution:
    # 方法一:循环除法
    def isPowerOfFour(self, n: int) -> bool:
        if n <= 0:
            return False
        while n % 4 == 0:
            n //= 4
        return n == 1
    
    # 方法二:位运算
    def isPowerOfFourBit(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and (n & 0x55555555) != 0
    
    # 方法三:数学方法
    def isPowerOfFourMath(self, n: int) -> bool:
        return n > 0 and (n & (n - 1)) == 0 and (n - 1) % 3 == 0

C++ 实现

class Solution {
public:
    // 方法一:循环除法
    bool isPowerOfFour(int n) {
        if (n <= 0) return false;
        while (n % 4 == 0) {
            n /= 4;
        }
        return n == 1;
    }
    
    // 方法二:位运算
    bool isPowerOfFourBit(int n) {
        return n > 0 && (n & (n - 1)) == 0 && (n & 0x55555555) != 0;
    }
    
    // 方法三:数学方法
    bool isPowerOfFourMath(int n) {
        return n > 0 && (n & (n - 1)) == 0 && (n - 1) % 3 == 0;
    }
};

执行结果

C# 实现

  • 执行用时:28 ms
  • 内存消耗:26.8 MB

Python 实现

  • 执行用时:32 ms
  • 内存消耗:15.7 MB

C++ 实现

  • 执行用时:0 ms
  • 内存消耗:5.9 MB

性能对比

语言执行用时内存消耗特点
C#28 ms26.8 MB代码结构清晰
Python32 ms15.7 MB实现简洁
C++0 ms5.9 MB性能最优

代码亮点

  1. 🎯 多种解法思路清晰
  2. 💡 位运算高效实现
  3. 🔍 数学方法巧妙
  4. 🎨 代码简洁易懂

常见错误分析

  1. 🚫 忘记处理负数
  2. 🚫 未考虑整数溢出
  3. 🚫 位运算符优先级错误
  4. 🚫 循环条件设置不当

解法对比

解法时间复杂度空间复杂度优点缺点
循环除法O(log n)O(1)直观易懂效率较低
位运算O(1)O(1)高效不易理解
数学方法O(1)O(1)优雅需要数学知识

相关题目


📖 系列导航

🔥 算法专题合集 - 查看完整合集

📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新至第342题。


💬 互动交流

感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。

如果这篇文章对你有帮助,请:

  • 👍 点个赞,让更多人看到这篇文章
  • 📁 收藏文章,方便后续查阅复习
  • 🔔 关注作者,获取更多高质量算法题解
  • 💭 评论区留言,分享你的解题思路或提出疑问

你的支持是我持续分享的动力!

💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值