Trailing Zeros

题目描述

Given an integer n, return the number of trailing zeroes in n!.

Note: Your solution should be in logarithmic time complexity.

解题方法

我们可以注意到有多少个0只跟有多少2和5有关,而2的数量一定比5多,所以只要关心有多少5就可以。

比如说 5! 有一个5, 11!有两个5 而28!有6个5,5, 10, 15, 20, 25(俩个)

我们可以发现对于5的Power也需要考虑加上它们里面的5,直到不再含有更大的power

所以解题的方法就是

  • n / 5, 得到所有5的一次方的数量,加到结果
  • 然后n/ (5^2), 得到所有5的二次方的数量,又多了这么多的5,加到结果里
  • 5的三次方。。。
  • 直到n不大于下一个5的k次方就可以停止了,说明已经不会再有5了

时间复杂度

取决于n大概是5的多少次方,所以是Math.round(Log5(n))

Solution

class Solution(object):
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 5:
            return 0
        result = 0
        fivePower = 1
        numberOfFive = n / (5 ** fivePower)
        while numberOfFive:
            result += numberOfFive
            fivePower += 1
            numberOfFive = n / (5 ** fivePower)

        return result

Reference