LeetCode172、阶乘后的零

105 阅读2分钟

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 * 210 能拆成 2 * 5,所以 10 =【2*(2*2)*5*(2*3)*(2*2*2)*(2*5)】

一个2和一个5配对,就产生一个0所以10!末尾20,转头一想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
};

image.png

优化

还可以通过另一种遍历方式来实现:

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)
};

image.png