LeetCode算法题-Factorial Trailing Zeroes

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Factorial Trailing Zeroes

这是悦乐书的第183次更新,第185篇原创

01 看题和准

今天介绍的是LeetCode算法题中Easy级别的第42题(顺位题号是172)。给定一个整数n,返回n!中的尾随零数。例如:

输入:3
输出:0
说明:3! = 6,没有尾随零。

输入:5
输出:1
说明:5! = 120,一个尾随零。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:当n小于等于0的时候,直接返回0。

先把n的阶乘算出来,再转为字符串,接着从字符串的最后一位往前遍历找0出现的次数,没有碰到0就就结束循环。为了避免计算阶乘溢出,使用BigInteger来做计算,借助其multiply方法。


public int trailingZeroes(int n) {
        int result = 0;
        if (n = 0) {
            return result;
        }
        BigInteger num = new BigInteger("1");
        for (long i=1; i = n; i++) {
            num = num.multiply(new BigInteger(i+""));
        }
        String str = num + "";
        if (str.lastIndexOf("0") != -1) {
            for (int j = str.length(); j  0; j--) {
                if ("0".equals(str.substring(j-1, j))) {
                    result++;
                } else {
                    break;
                }
            }
        }
        return result;
    }

此解法是一种思路,但是不推荐这么做,时间复杂度是O(n),空间复杂度是0(n)。

03 第二种解法

要判断n做完阶乘后的整数带几个0,可以反过来思考,尾数0可以由那些数相乘得到?0可以由10的倍数来得到,但是n的阶乘我们不能单独判断10出现的次数,还要继续分解,10是2乘以5的结果,任意一个正整数的阶乘,2出现的次数肯定多于5出现的次数,那就计算5出现的次数,到此是否就完了?还没有,因为有些数字自身就是带5的,比如25,125之类的,最后可以归纳成f(n)=n/5 + f(n/5),可以使用递归,也可以使用循环结构。

这是递归的解法。


public int trailingZeroes2(int n) {
    if (n5) return 0;
    if (n10) return 1;
    return n/5 + trailingZeroes2(n/5);
}

这是使用循环结构的解法。


public int trailingZeroes3(int n) {
    int result = 0;
    while (n0) {
        result += n/5;
        n /= 5;
    }
    return result;
}

还有更加疯狂的,一行代码搞定。


public int trailingZeroes4(int n) {
    return n == 0 ? 0 : n/5 + trailingZeroes4(n/5);
}

04 小结

算法专题目前已连续日更超过一个月,算法题文章42+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Factorial Trailing Zeroes

可能你还想看:

原文始发于微信公众号( 悦乐书 ):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> LeetCode算法题-Factorial Trailing Zeroes


 上一篇
LeetCode算法题-Excel Sheet Column Number LeetCode算法题-Excel Sheet Column Number
这是悦乐书的第182次更新,第184篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第41题(顺位题号是171)。给定Excel工作表中显示的列标题,返回其对应的列号。例如: A - 1 B - 2 C -
2021-04-05
下一篇 
LeetCode算法题-Majority Element(Java实现) LeetCode算法题-Majority Element(Java实现)
这是悦乐书的第181次更新,第183篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第40题(顺位题号是169)。给定大小为n的数组,找到数组中出现次数超过n/2的元素。假设该数组非空,并且该元素始终存
2021-04-05