LeetCode Math算法题(Easy级别)整理 Part 2

172. Factorial Trailing Zeroes

题目简介:给定一个数n,求n!的结尾连续的0的个数。

解题思路:通过观察可得,0只可能由2和5相乘获得,而5的个数总是小于等于2的个数,所以问题就转为了寻找n!中因子5的个数。代码如下:

class Solution(object):
    def trailingZeroes(self, n):
        """
        :type n: int
        :rtype: int
        """
        count = 0
        while n:
            count+=int(n/5)
            n = int(n/5)
        return count

204. Count Primes

题目简介:求解小于n的质数的个数。

解题思路:利用leetcode提供的hints可得到一种快速的解法。代码如下:

import math
class Solution(object):
    def countPrimes(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 3:
            return 0
        count = 0
        numberBook = [1]*n
        numberBook[0] = 0
        numberBook[1] = 0
        for i in range(2,int(math.sqrt(n)+1)):
            if numberBook[i] and self.checkPrime(i):
                t = i
                while (t*i < n):
                    numberBook[t*i] = 0
                    t+=1
        return sum(numberBook)
    
    def checkPrime(self,n):
        for i in range(2,int(math.sqrt(n)+1)):
            if n % i == 0:
                return False
        return True

453. Minimum Moves to Equal Array Elements

题目简介:对含有n个元素的数组,每次对n-1个数加1,直到最后所有数都相等。求需要加1的最少次数。

解题思路:易知,不被加1的数肯定是当前数组里的最大值。因此,可以反向思考,要对除了最大值以外的所有数加1,就相当于把最大值减1,而其他数不变。此题也就转化为了,其余各个数与最小值的差值为多少。代码如下:

class Solution(object):
    def minMoves(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        return sum(nums)-len(nums)*min(nums)
点赞