Article / 文章
LeetCode 第172题:阶乘后的零
给定一个整数 n,返回 n! 结果中尾随零的数量。 提示:n! = n (n - 1) (n - 2) ... 3 2 1
题目描述
给定一个整数 n,返回 n! 结果中尾随零的数量。
提示:n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
难度
中等
题目链接
示例
示例 1:
输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
示例 2:
输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
示例 3:
输入:n = 0
输出:0
提示
0 <= n <= 10^4
解题思路
方法:计算因子5的个数
尾随零的数量取决于阶乘中因子10的个数,而10 = 2 × 5。因为2的数量总是比5多,所以问题简化为计算阶乘中因子5的个数。 关键点:
- 计算n!中因子5的个数
- 注意到有些数字包含多个因子5,例如25 = 5 × 5,所以需要特殊处理
- 可以通过反复除以5来计算因子5的总数
时间复杂度:O(log n),因为每次除以5,n的值会减小到原来的1/5。 空间复杂度:O(1),只需要常数额外空间。
代码实现
C# 实现
public class Solution {
public int TrailingZeroes(int n) {
int count = 0;
// 计算n!中因子5的个数
while (n > 0) {
n /= 5;
count += n;
}
return count;
}
}
Python 实现
class Solution:
def trailingZeroes(self, n: int) -> int:
count = 0
# 计算n!中因子5的个数
while n > 0:
n //= 5
count += n
return count
C++ 实现
class Solution {
public:
int trailingZeroes(int n) {
int count = 0;
// 计算n!中因子5的个数
while (n > 0) {
n /= 5;
count += n;
}
return count;
}
};
性能分析
各语言实现的性能对比:
| 实现语言 | 执行用时 | 内存消耗 | 特点 |
|---|---|---|---|
| C# | 24 ms | 26.2 MB | 实现简洁,性能适中 |
| Python | 32 ms | 16.2 MB | 代码最简洁 |
| C++ | 0 ms | 5.9 MB | 性能最优 |
补充说明
代码亮点
- 不直接计算阶乘,避免了大数运算
- 通过数学推导简化了问题,直接计算因子5的数量
- 代码简洁高效,时间复杂度为O(log n)
常见错误
- 直接计算阶乘值然后统计尾随零,会导致大数溢出
- 只考虑了5的倍数,没有考虑包含多个因子5的数字(如25、125)
- 复杂化问题,没有抓住本质(只需要计算因子5的个数)