Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给定一个整数 n ,返回 n! 结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
二、思路分析:
题目一看到阶乘这不是简单的递归写一下就可以了,再加上最终尾数的零再加上个尾指针计数,那不是简简单单的一题,但是仔细想想会发现好像事情没有那么简单,应该阶乘的复杂度太高了,一定会超过时间限制,那么就要想想这题有什么巧妙地方法了,可以想到零可以从何而来,无非就是质数因子相乘得到,而那些偶数因子最终都是可以拆解成为指数因子的,那也就是说我们只要找到最终的质数因子的数量就可以了。那么是找哪些质数因子呢?可以发现只有2和5相乘得到的结果中末尾会存在0,也就是说,我们统计一下这个阶乘数的质数因子0和5的数量,然后取的较小的那个的数量就是我们要的结果,在进行一波推理,所有的偶数都是可以拆解出2这个因子的,但是不是所有的偶数都可以拆解出5这个因子,所以解放最终又进行了优化,那就是我们只需要求解5这个质数因子的数量!可以发现最终我们的答案特别的简单。
三、AC 代码:
代码一:
/**
* @param {number} n
* @return {number}
*/
var trailingZeroes = function(n) {
let cnt=0;
while(n!==0){
n=Math.floor(n/5);
cnt+=n;
}
return cnt;
};
四、总结:
可以发现有些题目看似很简单,但是要求的复杂度却很高,那么这时候普通的暴力解法就失效了,我们就要想到是否可以用我们之前说的位运算进行求解,或者说是今天的数学推到方式来进行求解,代码的难度并不大。但是推理的过程还是十分困难的。