LeetCode 172. Factorial Trailing Zeroes 阶乘后的零(Java)

题目:

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

Example 1:
Input: 3
Output: 0
Explanation: 3! = 6, no trailing zero.

Example 2:
Input: 5
Output: 1
Explanation: 5! = 120, one trailing zero.

Note: Your solution should be in logarithmic time complexity.

解答:

首先想到用常规的思路,求出阶乘的结果,然后mod10,让count++计算尾部0数量,但后来发现这种方法不是因为计算量大会超时,而是由于int的限制会产生溢出,未经思考!

class Solution {
    public int trailingZeroes(int n) {
        int result=1;
        for(int i=1;i<=n;i++){
            result=result*i;
        }
        int count=0;
        while(result!=0){
            if(result%10==0){
                count++;
            }else{
                return count;
            }
            result/=10;            
        }
        return count;
    }
}

后来看了他人的解法,得到以下思路:
通过找规律发现,要使阶乘的结果尾部有0,阶乘中的数需要包含 2 和 5 这两个因子。因此只要知道阶乘里因子5和因子2的个数,就知道了零的个数。

如:
n=5,5!= 1 * 2 * 3 * 4 * 5,这时能产生0的组合只有2 * 5,有一个0

n=10,10!= 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10,这时能产生0的组合有1 * 5,2 * 5,有2个0

n=15时,15!= 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15,有3个0

由此可见,每个阶乘都可以表示为 n! = 2 ^ x * 5 ^ y * …(其中x和y> = 0),而阶乘结果末尾零数取决于min(x,y),又由于因子2的个数远大于因子5的个数,因此,只需要数出因子5的个数即可

因此,求阶乘尾部0的问题,就转化为求解n中因子包含5的个数。

class Solution {
    public int trailingZeroes(int n) {
        int count=0;
        while(n>0){
            count+=n/5;
            n/=5;
        }
        return count;
    }
}

你可能感兴趣的:(LeetCode)