这是 leetcode 面试刷题一题多解系列的第14篇,阶乘后的零是一道比较简单的找规律算法题目。
题目
阶乘后的零
来源:力扣(LeetCode)
链接:leetcode.cn/problems/fa…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:数学规律
我们可以先找找规律,当一个数阶乘后,末尾的0来自于10的质因数分解的次数,10又可以分解为2和5,因此我们只需要数一下阶乘中有多少对2和5就行了。但是,由于2的个数一定比5多,所以我们只需要数一下阶乘中有多少个5即可。例如,10!中5的倍数有2个,15的倍数有1个,20的倍数有1个,25的倍数有1个,总共有5个5,所以10!末尾有2个0。
时间复杂度:O(logn)
空间复杂度:O(1)
var trailingZeroes = function(n) {
let count = 0;
while(n > 0) {
count += Math.floor(n / 5);
n = Math.floor(n / 5);
}
return count;
};
解法二:递归
由于阶乘中因数5的个数决定了结尾0的个数,因此我们可以递归地计算因数5的个数。
具体来说,对于一个数 n,它所包含的因数5的个数为 n/5 + n/25 + n/125 + ...,其中每个数相当于除以5的指数幂。
时间复杂度:O(logn)
空间复杂度:O(logn),其中空间复杂度为递归栈的深度,即调用次数。
function trailingZeroes(n) {
if (n === 0) {
return 0;
}
return Math.floor(n / 5) + trailingZeroes(Math.floor(n / 5));
}
我的更多前端资讯
欢迎大家技术交流 资料分享 摸鱼 求助皆可 —链接