小弟在后端与资料领域打滚过几年,也刷过上百题 Leetcode
同意大部分算法题确实工作上不会用到,但仍然有很多潜在价值存在
就来分享一下我觉得刷题真的"有意义"的那部分好了
1. 工程基本功
例如天字第一题,Two Sum,考得就是一个 Hash Table 的基本概念
也是非常常见的 junior developer 会遇到的场景
例如现在有两台机器,定期产出 1e6 笔资料量级的 excel 报表
现在要你写个系统 on-demand 读取并合并两张报表后返回给客户
如果做成 O(N^2) 然后跟主管说他就这么慢没办法
那技术显然很有问题...
2. 将理论实际应用的能力
例如 Trie 的概念本身不难
但突然碰到没见过得复杂变化问题
你有办法马上反应过来应用上去吗?
3. Coding 速度与准确度
你有没有办法在很短时间,实作一个中等难度的问题,然后一次就 bug free pass
这对应的是你平日工作的开发效率,还有逻辑是否缜密
如果你写两三行 code 就要一直 print 看输出修改逻辑漏洞
代表你对程式操作变量的熟练度不足
当要大量开发一些不太困难的工项时(这是公司常见场景),效率会较低落
而且可能会有潜藏的 bug
甚至 unit test 也帮不了你,因为你根本就没想到要测试这些 corner case
4. 后端系统设计
要你做数据库选择,那最少该对 B+Tree, LSM Tree 等结构有概念
要你做地图系统,那 Quad-Tree, R-Tree, KD-Tree, Z-Order Indexing 也该能聊聊?
或 Cache 系统最常见的 LRU/LFU cache 选择
分布式系统最基本的 Consistent Hashing 有哪些应用,好坏是什么
这类算法可能实作很复杂导致 Leetcode 不爱考
但 Leetcode 的部分题目也是从这些概念中提炼出来(例如一堆基本 Tree 操作)
足够小到可以变成一个 10~20min 写的完的题目
假如你 Leetcode 都写的出来,想来要理解系统设计真实应用的算法也不会太困难
5. 灵活思考
这就一些奇怪的观察力考验题
看你能不能看穿他转几个弯之后,就是某个简单的算法概念
跟考益智问题的意思差不多
因为他想找真的很聪明、头脑很灵活的人
如果聪明人想得出来,大量努力刷题苦练过的普通人也想的出来
那起码这个筛法有一定机率找到我想要的人,另一些也是肯努力的人
这样对面试官来说也不错了
6. 沟通能力
这个应该也被讲烂了
很多公司也没有要你一秒给最佳解(真的题题秒解还会怀疑你是哪边去偷到题目)
而是要看你一路跟面试官怎样讨论沟通,将答案一步步优化到最佳的整个过程
你刷的题目足够,思考也会更稳定,讨论更聚焦更有方向,对答案更有自信
如果他觉得你是个一起讨论研究问题很舒服的人,就有机会给正面评价
我自己就曾在 Appier 面试被丢了一个没有优于 O(N^2) 还是 O(N^3) 解的问题
(细节部分记忆模糊了... 也可能是没有 linear time 解)
但他问的一副有的样子,一直要我再想想
我想了一阵子,还是跟他解释了几种不同思路、假设、还有分别会遇到的障碍
然后很有自信的跟他说这确实没办法
面试官就很满意了,说那是他们真实遇到的难题,也确实还找不到办法,所以跟我聊聊
后来我们又聊了很多有趣的问题,是很棒的面试经验
假如当时我不够熟练的话,一定只会一直担心我哪里没想到,做不出来完蛋了死定了
大概就不会有后续了
当然啦,如果碰到不合格的面试官,或考题乱挑一通,那以上情境都不会发生
有些面试官只会背题,甚至自己也不懂
手上有一份答案,你讲的跟答案一样就 pass
你讲不一样但同样可以过(甚至还更好)的答案,通通都算 fail
那遇到这种也只能说运气不好,这场考试毫无意义
但不代表这整个算法面试的模式没有可取之处。