刷了 100 道 LeetCode,我也出两题回馈大家,难度适中,绝对不水

2017-11-11 11:56:53 +08:00
 begeekmyfriend
1、用递归求 Fibonacci,要求速度不低于迭代;
2、排序的整型数组,有重复,求某个元素出现次数。​​​​
4874 次点击
所在节点    程序员
31 条回复
chuaInQZ
2017-11-11 12:27:28 +08:00
1 尾递归
2 二分查找+前后遍历
geelaw
2017-11-11 12:32:36 +08:00
???这个真的连水都算不上

第一个用快速幂的递归写法即可满足要求,而且比迭代要快(如果四则运算是常数)
第二个用 upper_bound 和 lower_bound 的算法即可
LxExExl
2017-11-11 12:34:09 +08:00
2 二分查找 变换下等号就行了
geelaw
2017-11-11 12:34:11 +08:00
哦第一个还可以更简单,只要形参和返回值都是 pair 即可
begeekmyfriend
2017-11-11 12:41:03 +08:00
@LxExExl 绝知此事要躬行
LxExExl
2017-11-11 12:45:30 +08:00
@begeekmyfriend 愿闻其详
begeekmyfriend
2017-11-11 12:56:08 +08:00
begeekmyfriend
2017-11-11 12:58:30 +08:00
@geelaw 不懂你的“快速幂”是啥意思,方便贴一下么?还是利用某种语言的黑科技?
qiukun
2017-11-11 13:08:03 +08:00
@begeekmyfriend fibonacci 是线性关系可以用矩阵表示,矩阵乘法可以用类似普通幂乘的优化
qwlhappy
2017-11-11 13:23:37 +08:00
这不是...C 语言课后习题的水平?虽说想做到最优可能都要仔细考虑下
begeekmyfriend
2017-11-11 13:53:42 +08:00
@qwlhappy 到不一定要最优。第一题考 memorized+递归;第二题就是考二分编程,传说中 90%的人都会写错的那种

出面试题的原则——淘汰水货,中等水平做得出来,还能让高手闪光。
begeekmyfriend
2017-11-11 13:57:45 +08:00
说第二题很水的我有理由怀疑对方二分编程有没有真正掌握,一写都是 O(N)
neosfung
2017-11-11 14:03:22 +08:00
def foo(n, a=0, b=1):
return foo(n-1, b, a+b) if n>0 else a+b
neosfung
2017-11-11 14:06:34 +08:00
第二题直接用二分命中一个后,线性搜索前后的数字就行了,最坏情况 O(n)
begeekmyfriend
2017-11-11 14:22:41 +08:00
@neosfung 线性就淘汰,哈哈
neosfung
2017-11-11 14:36:48 +08:00
neosfung
2017-11-11 14:38:08 +08:00
@qiukun 貌似是编程之美中的方法?
sagaxu
2017-11-11 15:01:15 +08:00
太水了,第一题递归加 cache,第二题两次二分法确定这个数的首尾位置再相减得到个数
LxExExl
2017-11-11 15:39:34 +08:00
@begeekmyfriend 我去年找工作 lc 算下来刷了起码两遍 重点题三遍 基本到最后每个题都是 10 分钟一次性 ac...
xiang578
2017-11-11 16:11:22 +08:00
@neosfung #17 应该出现过,利用矩阵快速幂还可以处理比如求 Fibonacci 第 1 亿项对 1e9+7 取模的结果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/405509

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX