题目
给定一个整数 n
,返回 n!
结果中尾随零的数量。
输入: n = 3 输出: 0 解释: 3! = 6 ,不含尾随 0
题解
第一种
我们用一个数组dp
来记录每个数字的阶乘末尾零的个数。dp[i]
表示i的阶乘末尾零的个数。我们从1
开始遍历到n
,对于每个i
,我们计算出i
中5
的个数,然后用dp[i-1]
加上这个数,就得到了dp[i]
。最后返回dp[n]
即可,在这里我们需要注意的是,计算5
的个数时,我们需要用while
循环不断除以5
,直到除不尽为止。这样可以避免重复计算
var trailingZeroes = function (n) { let dp = new Array(n).fill(0); dp[0] = 0; const fiveCounts = n => { let cnt = 0; while (n % 5 === 0) { cnt++; n = n / 5; } return cnt; } for (let i = 1; i <= n; i++) { let fives = fiveCounts(i); dp[i] = dp[i - 1] + fives; } return dp[n]; };
第二种
函数trailingZeroes
接收一个整数n
,如果n
为0则直接返回0。否则,定义一个名为handler
的递归函数,用来计算n
的阶乘,返回值为BigInt
类型。在函数中,当n
等于1时返回1,否则返回n
乘以handler(n-1n)
的结果。这里使用BigInt
类型是因为计算阶乘时很容易超出JS的计数范围,而使用BigInt
可以避免这个问题,然后我们接下来,调用handler(BigInt(n))
计算出n
的阶乘,并将结果转化为字符串,赋值给变量result
。接着,获取result
的长度,用变量len
记录下来。定义变量count
初始化为0,用来记录末尾零的个数。从字符串的末尾开始遍历,如果当前字符是零,就将count
加1;否则,跳出循环。最后,返回count
即可
var trailingZeroes = function (n) { if (!n) return 0; const handler = (n) => { if (n === 1n) return 1n; return n * handler(n - 1n); } const result = handler(BigInt(n)).toString(); const len = result.length; let count = 0; for (let i = len - 1; i >= 0; i--) { if (result[i] === '0') { count += 1; } else { break; } } return count; };