LeetCode 172:阶乘后的零

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

示例 1:
  输入: 3
  输出: 0
  解释: 3! = 6, 尾数中没有零。
示例 2:
  输入: 5
  输出: 1
  解释: 5! = 120, 尾数中有1个零。

  说明:算法的时间复杂度应为 O(log n)。

  理解:最简单粗暴的方法就是先乘完再说,然后再数尾数有几个零?

  发现规律:在使用暴力破解法的过程中会发现,什么时候会出现零呢?这9个数字中只有2和5相乘才会有0的出现,或者他们的倍数。因此,问题变转变成求这个阶乘数中能匹配多少对2和5的问题。

例如:
  10! = 【2*(2*2)*5*(2*3)*(2*2*2)*(2*5)】

  进一步发现:因子分解之后2的个数肯定是大于5的个数的,所以能匹配多少对取决于5的个数。那么,问题又转变成求这个阶乘数中有多少个5的因子的问题。

  注意:25 = 5*5, 125 = 5*5*5 ,..., 需要额外考虑。

  以下高能!!!


# 解法一
class Solution:
    def trailingZeroes(self, n: int) -> int:
        res = 0
        k = 1
        while n >= 5 ** k:
            res += n // (5 ** k)
            k += 1
        return res
# 解法二
class Solution:
    def trailingZeroes(self, n: int) -> int:
        if n < 5:
            return 0
        return n // 5 + self.trailingZeroes(n // 5)

END 2019-05-06 21:19:02

猜你喜欢

转载自www.cnblogs.com/hider/p/10822176.html
今日推荐