开启我的LeetCode刷题日记:172. 阶乘后的零

237 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:172. 阶乘后的零

给定一个整数 n ,返回 n! 结果中尾随零的数量。

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

 

示例 1:

输入:n = 3 输出:0 解释:3! = 6 ,不含尾随 0

示例 2:

输入:n = 5 输出:1 解释:5! = 120 ,有一个尾随 0

示例 3:

输入:n = 0 输出:0  

提示:

0 <= n <= 104  

进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/fa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

肯定不可能真去把 n! 的结果算出来,阶乘增长可是比指数增长都恐怖

两个数相乘结果末尾有 0,一定是因为两个数中有因子 2 和 5,因为 10 = 2 x 5

也就是说,问题转化为:n! 最多可以分解出多少个因子 2 和 5

举例来说,n = 25,那么 25! 最多可以分解出几个 2 和 5 相乘?这个主要取决于能分解出几个因子 5,因为每个偶数都能分解出因子 2,因子 2 肯定比因子 5 多得多

现在,问题转化为:n! 最多可以分解出多少个因子 5

假设 n = 125,来算一算 125! 的结果末尾有几个 0

125 / 5 = 25,这一步就是计算有多少个像 5,15,20,25 这些 5 的倍数,它们一共可以提供一个因子 5 像 25,50,75 这些 25 的倍数,可以提供两个因子 5,那么我们再计算出 125! 中有 125 / 25 = 5 个 25 的倍数,它们每人可以额外再提供一个因子 5

我们发现 125 = 5 x 5 x 5,像 125,250 这些 125 的倍数,可以提供 3 个因子 5,那么我们还得再计算出 125! 中有 125 / 125 = 1 个 125 的倍数,它还可以额外再提供一个因子 5

125! 最多可以分解出 25 + 5 + 1 = 31 个因子 5,也就是说阶乘结果的末尾有 31 个 0

代码实现

/**
 * @param {number} n
 * @return {number}
 */
var trailingZeroes = function (n) {
  let res = 0;
  for (let d = n; d / 5 > 0; d = d / 5) {
    res += Math.floor(d / 5);
  }
  return res;
};



总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹