Leetcode 172:階乘後的零(超詳細的解法!!!)
阿新 • • 發佈:2019-01-09
給定一個整數 n,返回 n! 結果尾數中零的數量。
示例 1:
輸入: 3
輸出: 0
解釋: 3! = 6, 尾數中沒有零。
示例 2:
輸入: 5
輸出: 1
解釋: 5! = 120, 尾數中有 1 個零.
說明: 你演算法的時間複雜度應為 O(log n) 。
解題思路
首先想到的就是暴力解法。將階乘算出來,然後計算尾數有多少個零即可。
import math
class Solution:
def trailingZeroes(self, n):
"""
:type n: int
:rtype: int
"""
fac = math.factorial(n)
res = 0
while fac:
if fac % 10 == 0:
res += 1
else:
break
fac //= 10
return res
但是這種做法在輸入數較大的時候就超時了。有什麼更好的解法呢?
我們發現題目的問題是尾數有多少個零,這就很有講究了。首先5*2=10
和1*10=10
10!
結尾必然會有兩個0
,那麼有什麼規律呢?我們發現10
又可以看成是2*5
,所以歸根結底還是要看5
有多少個,這就很簡單了n//5
即可。但是計算100!
的時候發現少計算了個數,在哪呢?O(∩_∩)O哈哈~在25
的時候,我們將25=5*5
,所以應該時會有兩個零才對(因為2
的數量有很多,你看16
就有四個2
了,原因在於2<5
,所以同樣大的數,必然其中包含2
的數量大於5
)。以此類推,對於5**n
都要做處理。那麼這個問題就很簡單了
class Solution:
def trailingZeroes(self, n):
"""
:type n: int
:rtype: int
"""
res, k = 0, 5
while k <= n:
res += n//k
k *= 5
return res
遞迴寫法。
class Solution:
def trailingZeroes(self, n):
"""
:type n: int
:rtype: int
"""
return 0 if n == 0 else n // 5 + self.trailingZeroes(n // 5)
我將該問題的其他語言版本新增到了我的GitHub Leetcode
如有問題,希望大家指出!!!