leetcode 793.阶乘函数后K个零 Java

题目链接

https://leetcode-cn.com/problems/preimage-size-of-factorial-zeroes-function/

描述

 f(x) 是 x! 末尾是0的数量。(回想一下 x! = 1 * 2 * 3 * ... * x,且0! = 1)

例如, f(3) = 0 ,因为3! = 6的末尾没有0;而 f(11) = 2 ,因为11!= 39916800末端有20。给定 K,找出多少个非负
整数x ,有 f(x) = K 的性质。

注意:

K是范围在 [0, 10^9] 的整数。

示例

示例 1:

输入:K = 0
输出:5
解释: 0!, 1!, 2!, 3!, and 4! 均符合 K = 0 的条件。

示例 2:

输入:K = 5
输出:0
解释:没有匹配到这样的 x!,符合K = 5 的条件。

初始代码模板

class Solution {
    public int preimageSizeFZF(int K) {
      
    }
}

代码

虽然题目是困难标签,其实难度并不高。分解题目内容,其实问题也就是n!后多少个零以及二分的运用。

很容易想到遍历,一直遍历到某个数的阶乘后的零大于K。
但是这个阶乘后的零是单调递增的,没必要遍历,直接使用二分即可。
况且分析阶乘后k个零的算法,多少个零与n中5的个数有关,所以一个数n的阶乘后的零为K个,那么应该是有5个数的阶乘后的零都为K个。
否则没有任何符合规定的数字。
推荐题解:
https://labuladong.gitbook.io/algo/suan-fa-si-wei-xi-lie/3.4-shu-xue-yun-suan-ji-qiao/jie-cheng-ti-mu

https://leetcode-cn.com/problems/preimage-size-of-factorial-zeroes-function/solution/jie-cheng-han-shu-hou-kge-ling-by-leetcode/

class Solution {
    public int preimageSizeFZF(int K) {
        long k = K;
        long lo = k;
        long hi = 5 * k + 1;

        while (lo <= hi) {
            long mid = lo + (hi - lo) / 2;

            long num = count(mid);
            if (num > k) {
                hi = mid - 1;
            } else if (num < k) {
                lo = mid + 1;
            } else {
                return 5;
            }
        }

        return 0;
    }
    
    private long count(long n) {
        if (n == 0) {
            return 0;
        }
        
        return n / 5 + count(n / 5);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值