力扣解法汇总172-阶乘后的零

本文针对力扣的一道题目进行解答,题目要求计算阶乘结果中尾随零的数量。通过分析可知,只需关注因数5的个数即可,因为因数2远多于因数5。文章提供了详细的解题思路及Java代码实现。

目录链接:

力扣编程题-解法汇总_分享+记录-优快云博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

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

提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1

示例 1:

输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
示例 2:

输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
示例 3:

输入:n = 0
输出:0
 

提示:

0 <= n <= 104
 

进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/factorial-trailing-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

* 解题思路:
* 求0的数量,我们拆分一下,只有2*5的时候才会出现0。其余的4*5,3*10等等,拆最小公约数,也都是2和5。
* 所以我们只要求2和5的数量,取两者的较小值即可。实际操作中,2的数量远远大于5的数量,所以我们只要求5出现的数量即可

代码:

public class Solution172 {

    public int trailingZeroes(int n) {
        int fiveNum = 0;
        for (int i = 5; i <= n; i+=5) {
            //求包含5个数量
            int local = i;
            while (local % 5 == 0) {
                fiveNum++;
                local = local / 5;
            }
        }
        return fiveNum;
    }


}

### LeetCode 560 题 数组 1 -1 0 解题思路 LeetCode 第 560 题的目标是从给定数组中找出子数组之和等于目标值 `k` 的数量。对于特定的数组元素如 `1`, `-1`, 和 `0`,可以利用前缀和的思想来优化算法效率。 #### 前缀和的概念 前缀和是一种常见的技巧,用于快速计算区间内的总和。定义一个数组 `prefix[i]` 表示从索引 `0` 到 `i-1` 的累加和,则任意子数组 `[j, i)` 的和可以通过 `prefix[i] - prefix[j]` 计算得到[^4]。 #### 使用哈希表存储前缀和 为了进一步提高效率,可以用哈希表记录之前出现过的前缀和及其频率。这样,在遍历过程中可以直接查询是否存在某个前缀和使得当前子数组满足条件。具体实现如下: ```python class Solution: def subarraySum(self, nums: List[int], k: int) -> int: count = 0 sums = 0 hash_map = {0: 1} for num in nums: sums += num if (sums - k) in hash_map: count += hash_map[sums - k] hash_map[sums] = hash_map.get(sums, 0) + 1 return count ``` 此代码片段展示了如何通过维护一个累积和变量以及一个字典(或称为映射),有效地追踪并统计符合条件的子数组数目。 #### 对于特殊输入 `{1, -1, 0}` 当处理仅含 `1`, `-1`, 和 `0` 的数组时,由于这些数值特性简单明了,上述通用方法依然适用并无额外复杂度增加的情况。例如考虑测试用例 `nums = [1, -1, 0]` 并设 `k=0`: 执行过程会发现存在两个连续子序列其和恰好为即 `[1,-1]` 及单个元素 `[0]`. 因此最终返回的结果应当是这两个有效组合的数量总计为二. ### 结论 综上所述,采用基于前缀和与哈希表的方法能够高效解决该类问题,并且无论针对何种类型的整型数据集均表现良好。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失落夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值