LeetCode——172. 阶乘后的零(Java)

题目描述

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

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

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

题解思路

两步走,第一部肯定是让你写阶乘,第二步就是求这个数后面有几个零

写阶乘没有歧义,无论你递归写还是循环写都可以,求零的个数就选自己就选择用除以10求个数

官方题解给出原来这种办法最好用BigInteger来防止溢出问题,之所以不用Integer是因为它的范围和int一样太小

用这个方法我才知道原来LeetCode提交代码也得导入包,我以为他自己后台会默认都导入呢,这也是意外收获吧,下次就知道了

做法是没错,但是提交发现超出时间了,看了官方的其他方法,他给出了一个用规律总结的答案,统计这些数字中5的个数,这就是最后的答案

因为想要数字最后是0,无非是10*1或者是2*5这两种情况,然后把前一种作为1*2*5也归类到第二种,每出现一对2和5,那就是一个10,而且统计发现2的数量远大于5

所以说统计学归为数学是有道理,而且官方给出了更优化的思路代码,这个推理过程就有点看不懂了,大佬如果想解释给我听的话,我在最后给出代码了

正确代码

import java.math.BigInteger;

public class MyTrailingZeroes {

    //超出时间
    public int trailingZeroes(int n) {
        BigInteger nFactorial = BigInteger.ONE;
        for (int i = 2; i <= n; i++) {
            nFactorial = nFactorial.multiply(BigInteger.valueOf(i));
        }

        int zeroCount = 0;

        while (nFactorial.mod(BigInteger.TEN).equals(BigInteger.ZERO)) {
            nFactorial = nFactorial.divide(BigInteger.TEN);
            zeroCount++;
        }
        return zeroCount;
    }

    //找5的个数
    public int trailingZeroes1(int n) {
        int zeroCount = 0;
        for (int i = 5; i <= n; i += 5) {
            int powerOf5 = 5;
            while (i % powerOf5 == 0) {
                zeroCount += 1;
                powerOf5 *= 5;
            }
        }
        return zeroCount;
    }

    //进阶算法
    public int trailingZeroes2(int n) {
        int zeroCount = 0;
        long currentMultiple = 5;
        while (n > 0) {
            n /= 5;
            zeroCount += n;
        }
        return zeroCount;
    }

总结

这次用BigInterger的时候温习了一下操作符方法,平时不用的话很快就忘了,果然纯数学标签的题总有他独特的思路,都是要总结下来的

文章如果存在问题或者有大牛想要给我解释一下第三种优化思路的话,请斧正或评论区告诉我,各自努力,你我高出相见

posted @ 2021-03-27 11:26  21岁还不是架构师  阅读(60)  评论(0)    收藏  举报