LeetCode题练习与总结:阶乘后的零--172

223 篇文章 0 订阅
135 篇文章 0 订阅

一、题目描述

给定一个整数 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

二、解题思路

要找出一个数的阶乘结果中尾随零的数量,我们需要知道这个数可以被分解成多少对2和5的乘积。因为在10进制中,一个尾随零是由一个因子10产生的,而10可以分解为2和5的乘积。在阶乘中,2的因子数量远多于5的因子数量,所以我们只需要计算5的因子的数量。

具体步骤如下:

  1. 初始化一个变量来计数5的因子的数量。
  2. 遍历从1到n的所有整数。
  3. 对于每个整数,计算它包含多少个5的因子,并累加到计数变量中。
  4. 由于25、125等数字包含多个5的因子,我们需要在遍历过程中多次除以5来确保所有5的因子都被计算。
  5. 最后返回计数变量的值。

三、具体代码

class Solution {
    public int trailingZeroes(int n) {
        int count = 0;
        for (int i = 5; i <= n; i += 5) {
            int current = i;
            while (current % 5 == 0) {
                count++;
                current /= 5;
            }
        }
        return count;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 循环:代码中的外部循环会执行 n/5 次,因为它是从5开始,每次增加5。
  • 内部循环:对于每个被5整除的数,我们可能需要多次除以5,直到该数不再是5的倍数。在最坏的情况下,一个数可能包含多个5的因子(例如25包含两个5,125包含三个5等)。

具体来说,我们可以这样分析:

  • 对于5的倍数(5, 10, 15, …, n),我们需要至少除一次。
  • 对于25的倍数(25, 50, 75, …, n),我们需要除两次。
  • 对于125的倍数(125, 250, 375, …, n),我们需要除三次。
  • 以此类推。

因此,内部循环的迭代次数与n中包含的5的因子的数量有关。

综合以上,我们可以得出时间复杂度的上界是O(n/5 + n/25 + n/125 + …),这是一个几何级数,其和收敛于n/4。因此,时间复杂度是O(n)。

2. 空间复杂度
  • 变量count和current只使用了常数空间,与输入n的大小无关。
  • 循环中没有使用额外的数据结构,如数组或集合。

因此,空间复杂度是O(1),即常数空间复杂度。这是因为无论输入n的大小如何,算法使用的额外空间都不会增加。

五、总结知识点

1. 循环控制

  • for循环:用于遍历从5到n的整数,步长为5。
  • while循环:用于处理当前数字中包含的5的因子数量。

2. 条件判断

  • while循环的条件current % 5 == 0:检查当前数字是否仍然是5的倍数。

3. 逻辑推理

  • 理解尾随零的生成机制:尾随零由因子10产生,而10可以分解为2和5的乘积。在阶乘中,2的因子数量远多于5,因此计算5的因子数量即可确定尾随零的数量。

4. 数学知识

  • 阶乘概念:n!表示n的阶乘,即n * (n-1) * (n-2) * … * 3 * 2 * 1。
  • 因子分解:将一个数分解为其质因数的乘积。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一直学习永不止步

谢谢您的鼓励,我会再接再厉的!

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

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

打赏作者

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

抵扣说明:

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

余额充值