今天刷到一篇帖子:
文中来自川大的数学博士吐槽了华为对数学博士的招聘。
作者强调自己是川大的本硕博(算子分析方向),有论文,也拿过国家一等奖。
但自己投的华为简历,却石沉大海,了无音讯。
还直言道:自己在数学系待了 10 年,没有任何一个数学博士能够满足华为招聘三条要求中的两条,如果数学博士干的是华为招聘上的事情,毕业都难。
这事儿,怎么说呢,从不同角度,会有不同的理解。
首先,在企业招聘中,学历往往是起点门槛要求,而非唯一要求。
因此肯定不是说满足数学博士要求,就必然入面试,这一点和「本科/硕士」一样。
其次,企业招聘中,往往是「应用类」人才占比要比「科研类」人才占比更高。
因此在学历(数学博士)要求上,往往还会有企业所期望的技能要求,例如文中说的「熟练使用计算机编程语言」,也算是常规操作。
至于原帖作者说的,因为「华为招聘中有很多不是数学博士专业领域知识要求」,就得出「华为觉得不到这个水平就不算是博士」的结论,多少有点偏激了。
...
回归主线。
来一道不是数学博士也能做出来的算法题。
这道题曾经还是华为的校招机试原题。
平台:LeetCode
题号:172
给定一个整数
,返回
结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1
示例 1:
输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
示例 2:
输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
提示:
进阶:你可以设计并实现对数时间复杂度的算法来解决此问题吗?
对于任意一个
而言,其尾随零的个数取决于展开式中
的个数,而
可由质因数
而来,因此
的尾随零个数为展开式中各项分解质因数后
的数量和
的数量中的较小值。
即问题转换为对
中的各项进行分解质因数,能够分解出来的
的个数和
的个数分别为多少。
为了更具一般性,我们分析对
中各数进行分解质因数,能够分解出质因数
的个数为多少。根据每个数能够分解出
的个数进行分情况讨论:
的个数为
的倍数,在
范围内此类数的个数为
的个数为
的倍数,在
范围内此类数的个数为
个
的个数为
的倍数,在
范围内此类数的个数为
「我们定义一个合法的
需要满足
,上述的每一类数均是前一类数的「子集」(一个数如果是
的倍数,必然是
的倍数),因此如果一个数是
的倍数,其出现在的集合数量为
,与其最终贡献的
的数量相等。」
回到本题,
中质因数
的数量为 :
中质因数
的数量为 :
由
,可知
,同时
相同的每一项满足
,可知最终
,即质因数
的个数必然不会超过质因数
的个数。我们只需要统计质因数
的个数即可。
Java 代码:
class Solution {
public int trailingZeroes(int n) {
return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
}
}
Python 代码:
class Solution:
def trailingZeroes(self, n: int) -> int:
return n // 5 + self.trailingZeroes(n // 5) if n else 0