LeetCode - 172 - 阶乘后的零(factorial-trailing-zeroes)

Create by jsliang on 2019-7-8 08:07:23
Recently revised in 2019-7-8 09:14:41

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 | | 四 执行测试 | | 五 LeetCode Submit | | 六 解题思路 |

二 前言

  • 难度:简单

  • 涉及知识:数学

  • 题目地址:https://leetcode-cn.com/problems/factorial-trailing-zeroes/

  • 题目内容

给定一个整数 n,返回 n! 结果尾数中零的数量。	
示例 1:	
输入: 3	
输出: 0	
解释: 3! = 6, 尾数中没有零。	
示例 2:	
输入: 5	
输出: 1	
解释: 5! = 120, 尾数中有 1 个零.	
说明: 你算法的时间复杂度应为 O(log n) 。

三 解题

小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。

  • 解题代码

var trailingZeroes = function(n) {	
  let total = 0;	
  while (n >= 5) {	
    n = Math.floor(n / 5);	
    total += n;	
  }	
  return total;	
};

四 执行测试

  1. n: 30

  2. return: 7

五 LeetCode Submit

√ Accepted	
  √ 502/502 cases passed (80 ms)	
  √ Your runtime beats 92.95 % of javascript submissions	
  √ Your memory usage beats 68.18 % of javascript submissions (33.9 MB)

六 解题思路

首先,需要明确的是,这道题不能使用递归,因为超时了。

然后,这道题还需要考虑超限:

var trailingZeroes = function(n) {	
  let result = 1;	
  while(n > 0) {	
    result = result * n;	
    n--;	
  }	
  result = result.toString().split('').reverse();	
  for (let i = 0; i < result.length; i++) {	
    if (result[i] !== '0') {	
      return i;	
    }	
  }	
  return 0;	
};

在这份代码中,当你的数字为 30 的时候,你就超限了:

× Wrong Answer	
  × 21/502 cases passed (N/A)	
  × testcase: '30'	
  × answer: 0	
  × expected_answer: 7

个人觉得这是正常思路,但是看到它这里显示 21/502,那么我就知道,它又想考我的智商了。

智商税得交,谁让你数学没那么好呢!

接着,咱访问下【评论】和【题解】,看看别人怎么破解,其中思路非常 nice 的是:

  • https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/jie-cheng-hou-de-ling-die-dai-ji-di-gui-jie-fa-by-/

它的题解有两种:

题解 1 - 迭代

var trailingZeroes = function(n) {	
  let total = 0;	
  while (n >= 5) {	
    n = Math.floor(n / 5);	
    total += n;	
  }	
  return total;	
};

题解 2 - 递归

var trailingZeroes = function(n) {	
  const helper = (n, total) => {	
    if (n < 5) {	
      return total;	
    }	
    const count = Math.floor(n / 5);	
    return helper(count, total + count);	
  };	
  return helper(n, 0);	
};

那么,jsliang 看完题解,以自己意思表述一下:

1. 末尾有 0 是因为其中有 10 的因数,即 2*51*10 这种情况。

2. 找规律:当 n 为 5 时,有 1 个 0,当 n 为 10 时,有 2 个 0……但是,碰到某个特定的数时,会有意外,详情看表格:

n个数
51
102
153
204
256
307
358
409
4510
5012

即当 n 为 25 倍数的时候,还需要将个数调整一次:

var trailingZeroes = function(n) {	
  let total = 0;	
  while (n >= 5) {	
    n = Math.floor(n / 5);	
    total += n;	
  }	
  return total;	
};

再结合题意,小伙伴们应该就比较清晰了。

最后,我们就得出了这道题的题解。


不折腾的前端,和咸鱼有什么区别!

640?wx_fmt=jpeg

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

扫描上方二维码,关注 jsliang 的公众号,让我们一起折腾!

640?wx_fmt=png

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值