北美找工一年,分享我的刷题感悟

微风轻心 2024-12-13 10:50+-

最近phd快毕业了,焦虑找实习找工作持续了一年多,现在感觉快要迎来短暂的上岸期了,大概总结一下刷题相关的感悟,主要是自己总结将来反思用的。

地里类似的经验估计也不少,本帖很可能会有重复。Anyway,希望帮到有缘人,欢迎大家讨论。

刷题零经验或者不熟悉基础数据结构算法的需要先学习基础功,基础功达标永远是第一步。这个帖子重心在后面的阶段。

基础功达到一定层次之后 重心转成涨见识。

许多算法套路没见过就是很难想出来,见多了用多了自然就熟悉了,熟了之后才有可能在面试期间的高压环境下提出来。

涨见识这里就是常规的刷题。碰到一道题需要先自己想一想,然后尝试做一做。不管做出来与否,都要仔细看leetcode会员答案,熟悉一种或几种常见的最优解的思路,分析时间空间tradeoff。

涨见识阶段有个问题就是,算法这么多年里,奇技淫巧太多了,挨个学习过于费脑也花时间,所以这里建议第一次见到的技巧熟悉high-level idea,重复见到的技巧算法尽量熟悉掌握,尤其是重复出现而且想法简单的技巧,比如常规DP pattern,monotonic stack。

rolling hash之类的算法出现的少一些,但是想法简单,这种学起来也成本不高,可以考虑。

过完涨见识阶段大概碰到一个题会有基础思路,接下来建议专门考虑一下code smell,如何优雅的实现与解题。

这个对于bug-free很有帮助,也是我个人感觉区分入门与内行的一个重要分水岭。

聪明的初学者可以提出能用的解决方案,但懂行的人写简洁易懂的代码。

为了学习好的code smell,首先需要识别什么是好的代码,然后检查自己的代码寻找不够优雅的地方,看看别人是怎么做的。

这个阶段只靠leetcode editorial还不够,需要多刷一刷leetcode其他人分享的solution,寻找自己喜欢的代码。高手在民间。

过完code smell之后可以考虑研究hard怎么解题。

很多人觉得很多hard就是不可能在面试期间简单直接的整出来,当然有一定道理。

但刷hard的目的我觉得更多的是能轻松摆平medium,以及在有hint的情况下整完hard。这个阶段训练的是思维模式,如何入手hard。

我觉得对于hard题,找observation是核心。就像是推数学定理证明那样,发现一个核心的observation就解决了hard题一大半的路,随后围绕核心的observation设计算法。

问题是如何找observation。从brute-force入手是一个说烂了的,但好用的思路。

除此之外,可以手动推到一些test case,检查自己计算过程中有什么规律。

先提出猜想,再分析验证猜想是否成立。对于能在面试解决的hard,你只需要找到一个或者最多两个规律、observation就可以了。

这需要一个训练的过程,平时刷题就要多训练。个人感觉这个能力远比刷题更有意义。

observation还可以倒推寻找,从结果入手分析什么对结果有利。欢迎大家讨论有什么寻找observation的思路。

有了observation和大概的算法设计框架之后,建议先罗列high-level pseudo-code再动手写代码,避免过早陷入细节纠结。

有的时候明明有了想法但就是代码没法快速的写出来,这个时候感觉先罗列high-level会有帮助。

最后就是平时练习保持手感,或者多做总结保证需要的时候能快速上手。

祝大家都能尽早上岸,事事顺心!