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
具体步骤:
- 判断n是否大于0
- 循环除以4直到不能整除
- 判断最后结果是否为1
时间复杂度:O(log n)
空间复杂度:O(1)
方法二:位运算
利用位运算的特性来判断。
关键点:
- 4的幂一定是2的幂
- 4的幂的1位于奇数位
- 使用位掩码0x55555555
具体步骤:
- 判断是否为2的幂
- 判断1是否在正确的位置
时间复杂度:O(1)
空间复杂度:O(1)
方法三:数学方法
利用数学性质来判断。
关键点:
- 4的幂减1是3的倍数
- 同时必须是2的幂
图解思路
位运算分析表
数字 | 二进制表示 | 是否为4的幂 | 原因 |
---|---|---|---|
1 | 0001 | 是 | 4^0 |
4 | 0100 | 是 | 4^1 |
16 | 10000 | 是 | 4^2 |
2 | 0010 | 否 | 不是4的幂 |
8 | 1000 | 否 | 不是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 ms | 26.8 MB | 代码结构清晰 |
Python | 32 ms | 15.7 MB | 实现简洁 |
C++ | 0 ms | 5.9 MB | 性能最优 |
代码亮点
- 🎯 多种解法思路清晰
- 💡 位运算高效实现
- 🔍 数学方法巧妙
- 🎨 代码简洁易懂
常见错误分析
- 🚫 忘记处理负数
- 🚫 未考虑整数溢出
- 🚫 位运算符优先级错误
- 🚫 循环条件设置不当
解法对比
解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
---|---|---|---|---|
循环除法 | O(log n) | O(1) | 直观易懂 | 效率较低 |
位运算 | O(1) | O(1) | 高效 | 不易理解 |
数学方法 | O(1) | O(1) | 优雅 | 需要数学知识 |
相关题目
- LeetCode 231. 2的幂 - 简单
- LeetCode 326. 3的幂 - 简单
- LeetCode 263. 丑数 - 简单
📖 系列导航
🔥 算法专题合集 - 查看完整合集
📢 关注合集更新:点击上方合集链接,关注获取最新题解!目前已更新至第342题。
💬 互动交流
感谢大家耐心阅读到这里!希望这篇题解能够帮助你更好地理解和掌握这道算法题。
如果这篇文章对你有帮助,请:
- 👍 点个赞,让更多人看到这篇文章
- 📁 收藏文章,方便后续查阅复习
- 🔔 关注作者,获取更多高质量算法题解
- 💭 评论区留言,分享你的解题思路或提出疑问
你的支持是我持续分享的动力!
💡 一起进步:算法学习路上不孤单,欢迎一起交流学习!