Leetcode 172

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

示例 1:

输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。

示例 2:

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

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

分析:

一开始,最自然的想法就是先定义个阶乘函数,然后发现时间太长无法通过。

代码如下:

def factorial(n):
   if n == 0:
      return 1
   return n * factorial(n - 1)

n=5
result = factorial(n)
result = str(result)[::-1]
count = 0
for i in range(len(result)):
   if result[0] != '0':
      print(0)
   else:
      if result[i] == '0':
         count += 1
         continue
      if result[i] != '0':
         print(count)                

发现这样不行之后开始分析方法,所以我们可以将阶乘进行因式分解,比如5!=1*2*3*4*5=1*2*3*2*2*5,共有1对2*5,所以结果就只有一个0嘛;有几对2*5,结果就有几个0!
所以问题就简化为找有几对2*5,能不能进一步简化捏?必须可以啊!
我们发现2的个数是远远多于5的,所以最终简化为了找出5的个数!
如果找出5的个数呢,比如20!,从1到20,共有5,10,15,20,共有4个5,即结尾0的个数为n/5!
这样就ok么?当然没ok,25!结果不只是25/5=5个0,25结果有6个0,因为25=5*5,有两个5。所以结果f(n)=n/5+f(n/5)!

最终的AC代码如下:

class Solution:

    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 5:
            return 0
        if n < 10:
            return 1
        return (n // 5 + self.trailingZeroes(n//5))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值