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
此时我们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));
};