气笑了,我把github给面试官,他说打不开地址。。。
今天看到一个笑话,有个程序员在面试时,把自己的 GitHub 链接发给了面试官,结果面试官回复:“打不开哦。”
作为程序员,GitHub简直是我们的“名片”。项目经验、代码仓库、开源贡献……这些东西全都可以在 GitHub 上展示。
如果你在面试时能把这些东西提供给面试官,基本就等于给自己加了不少分。然而,问题来了,GitHub在国内的访问情况大家都知道。如果面试官没有fan墙工具,你给他发 GitHub 链接,根本没法访问。
话说回来,这也是我们程序员的一个小“坑”吧,真是处处得小心。😆【备注:文末可领最新资料】。
算法题:阶乘函数后 K 个零
今天我们来聊聊一个很有意思的问题:阶乘后 K 个零。
想象一下,有这样一个问题:给定一个整数 n,你要计算 n!(n 的阶乘)末尾有多少个零?这个问题最初可能会让你觉得有点懵,毕竟阶乘计算起来已经够麻烦了,为什么还要关心末尾零的问题?不过,别急,我会一步步带你理清思路,保证你完全懂。
首先,我们来看看阶乘是什么。假如 n=5,那么 n! 就是 5! = 5 × 4 × 3 × 2 × 1 = 120。从结果可以看到,末尾有一个零。再看一个大点的例子,10! = 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 3,628,800,末尾有两个零。
那么,问题来了,怎么知道 n! 末尾有多少个零呢?我先给出一个直观的解释。
关键在于因子 10
每个零其实都代表了一个 10 的因子。一个 10 是由 2 和 5 两个因子组成的。那么在阶乘中,实际上每当你有一个因子 5 和一个因子 2,它们就构成了一个 10,进而增加了一个零。
但是,注意到一个有趣的地方:在阶乘中,因子 2 的数量总是比因子 5 多。所以,问题的关键就在于因子 5 的数量——每找到一个 5,就有一个零。
思路
我们可以通过这样的思路来解答这个问题:我们要找的是阶乘中包含多少个 5 的因子。这个问题可以通过除法来简化。
假设 n = 100,我们要找的零的数量就是 100! 中包含多少个 5 的因子。具体方法是:
计算 n / 5,得到整数部分(这就是有多少个数可以被 5 整除)。然后计算 n / 25(因为每 25 个数会多一个 5)。再计算 n / 125,以此类推,直到n / 5^k小于 1。
每个步骤的结果加起来就是 n! 末尾零的个数。
代码实现
public class FactorialTrailingZeroes {
public static int trailingZeroes(int n) {
int count = 0;
while (n >= 5) {
n /= 5;
count += n;
}
return count;
} public static void main(String[] args) {
int n = 100;
System.out.println("Number of trailing zeroes in " + n + "! is: " + trailingZeroes(n));
}
}
上面这段代码其实就是利用了我们刚才说的思路。n 不断除以 5,直到结果小于 5,每一步都累加到 count 里,最终返回的 count 就是 n! 末尾零的个数。
让我们以 100 为例来测试这段代码。100 / 5 = 20,意味着 100 以内有 20 个数能被 5 整除(这些数的阶乘中会有一个因子 5)。然后,100 / 25 = 4,说明 100 以内有 4 个数能被 25 整除,它们的阶乘中会有一个额外的因子 5。最后,100 / 125 = 0,我们就可以停止了。结果是:20 + 4 = 24,因此 100! 末尾有 24 个零。
优化和性能
有时候我们会遇到比较大的数,比如 n = 1000,对于这种情况,上面的算法依然能够高效地工作。每一次除法操作都大大减少了问题的规模,所以它的时间复杂度是 O(log n),而不是 O(n),这是我们算法优化的一个关键点。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。