LeetCode系列记录我学习算法的过程。
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
题目
给定一个整数 n ,返回 n! 结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
示例:
输入: n = 3
输出: 0
解释: 3! = 6 ,不含尾随 0
输入: n = 5
输出: 1
解释: 5! = 120 ,有一个尾随 0
输入: n = 0
输出: 0
提示:
0 <= n <= 104
思路
题目的意思是要求出阶乘后的结果后面有几个零,例如: 6! = 【1 * 2 * 3 * 4 * 5 * 6】
其中只有 2 * 5 末尾才有 0,所以就可以抛去其他数据 专门看2 5以及其倍数
毕竟 4 * 25 末尾也是 0,比如 10!=【2 * 4 * 5 * 6 * 8 * 10】
其中 4 能拆成 2 * 2,10 能拆成 2 * 5,所以 10 =【2*(2*2)*5*(2*3)*(2*2*2)*(2*5)】
一个2和一个5配对,就产生一个0所以10!末尾2个0,转头一想2肯定比5多,所以只数5的个数就行了:
- 首先我们定义一个变量
sum用来记录0出现的次数 - 然后遍历传入的数值,再对当前遍历项进行遍历获取含有
5的个数 - 最后返回结果即可
代码实现
/**
* @param {number} n
* @return {number}
*/
var trailingZeroes = function(n) {
// 定义一个变量存储结果
let sum = 0
// 遍历传入的数值
for (let i = 5; i <= n; i += 5) {
// 遍历当前数值
for (let x = i; x % 5 == 0; x /= 5) {
// 有5则自加
sum++
}
}
// 最后返回结果
return sum
};
优化
还可以通过另一种遍历方式来实现:
var trailingZeroes = function(n) {
// 定义变量存储结果
let sum = 0;
// 遍历传入的值
while (n !== 0) {
// 每次除于5
n = Math.floor(n / 5);
// 加上除去后的值
sum += n;
}
// 最后返回结果
return sum;
};
或者通过递归的方式也可以实现,如果当前值不为 0,则获取当前值除于 5 后取整的值然后将取整后的值进行递归,如果当前值为 0,则直接返回 0:
var trailingZeroes = function(n) {
// 如果当前值为 0,直接返回 0
if (!n) return 0
// 获取当前值除于 5 后取整的值
const num = Math.floor(n / 5)
// 将取整后的值 加上 递归取整后的值的结果
return num + trailingZeroes(num)
};