题目很简单,但是却是中等题?

129 阅读2分钟

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

四、总结:

可以发现有些题目看似很简单,但是要求的复杂度却很高,那么这时候普通的暴力解法就失效了,我们就要想到是否可以用我们之前说的位运算进行求解,或者说是今天的数学推到方式来进行求解,代码的难度并不大。但是推理的过程还是十分困难的。