【刷算法】LeetCode- 阶乘后的零

原题地点:LeetCode中国-172

题目形貌

给定一个整数 n,返回 n! 效果尾数中零的数目。

示例 1:

输入: 3
输出: 0
诠释: 3! = 6, 尾数中没有零。
示例 2:

输入: 5
输出: 1
诠释: 5! = 120, 尾数中有 1 个零.

申明: 你算法的时候复杂度应为 O(log n) 。

剖析

起首暴力破解法就是直接把终究的效果求出来然后看末端有几个0,然则如许做的时候复杂度肯定是太大了。

然后斟酌到末端的0是怎样构成的,起首10=2*5,20=2*2*5,30=3*2*5 … 100=10*2*5

所以,题目的关键是看阶乘内里2和5的数目,然则由于明显2涌现的数目大于5涌现的数目,拿5的阶乘来举例子:

5!= (1) * (2) * (3) * (2*2) * (5)

涌现了3个2、1个5,然则末端只要1个0,所以阶乘末端0的个数就是阶乘式中5的个数。然则如解法1的代码所示,时候复杂度照样太高。

继承斟酌,关于50!,我们能够写成:

5 … 2*5 … 3*5 … 4*5 … 5*5 … 6*5 … 7*5 … 8*5 … 9*5 … 10 * 5

能够看出来从5到10*5一共有10个5,然则关于10来讲,从1到10另有2个5,所以50!的效果末端有12个0

解法1(不符合请求的时候复杂度)

var trailingZeroes = function(n) {
  var count  = 0;
    
  for(var i = 1;i <= n;i++){
    var temp = i;
    while(temp%5 === 0){
      count++;
      temp /= 5;
    }
  }
  
  return count;
};

上面这个解法的时候复杂度是n*(logn),不符合题意

解法2

var trailingZeroes = function(n) {
  var count  = 0;
    
  while(n) {
    count += divide(n,5);
    n = divide(n,5);
  }
  
  return count;
};
  
function divide(n, m) {
  return Math.floor(n/m);
}
    原文作者:亚古
    原文地址: https://segmentfault.com/a/1190000015891874
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞