leetcode 172. 阶乘后的零

216 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

leetcode 172. 阶乘后的零

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

进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?

分析

根据题意可以看出我们只要算出n的阶乘结果有有多少个零即可,再根据提示中n的最大值为104我们直接求阶乘结果再统计0的个数也不太会运行超时。但其实还是有其实比较好的解决方法的。

我们可以用例二来分析一下: 对于5的阶乘也就是 5 * 4 * 3 * 2 * 1 = 120,我们可以看出个位的零是由于25才出现的。换句话来讲由于都是乘法存在几个25最后就会有几个零。我们可以通过一个比较大的阶乘来检验上述说法。

11的阶乘: 11! = 11 * 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = 11 * (2 * 5) * 9 * (4 * 2) * 7 * (3 * 2) * (1 * 5) * (2 * 2) * 3 * (1 * 2) * 1

image.png

此时我们2*5的个数有俩个,11的阶乘结果也有俩个零。我们可以进一步发现2的个数是远远大于5的个数的,也就是说我们只要找[1,n]含有多少个5的因数即可。

[1,11]其实5的因数是由10、5所提供的,从上述11的阶乘也可以看出。所以我们可以同计算5的因数个数就能找出n阶乘后的零了。

代码实现

/**
 * @param {number} n
 * @return {number}
 */
var trailingZeroes = function(n) {
    return n == 0 ? 0 : Math.floor(n / 5) + trailingZeroes(Math.floor(n / 5));
};