2021年9月开始刷题,10月开始打周赛,录播过一阵子也混过一些群(灵佬还是很佬的,可惜群里wsn太多,被恶心退了)。可以负责任的说我过的每一场面试都要感谢力扣。短期内不想刷题了,所以走之前也给社区回馈一个数据点/性价比刷题的一些经验吧。
(tldr: 先学算法数据结构再刷题 & 两千分前放过dp吧求求你们了)
免责声明:我只关心面试找工作+力扣随便上上分,编程竞赛与我无关。下文一切观点的前提都是以面试找工作为目的刷题。

战绩如图,见clist.
因为改过一次用户名,所以clist扒得不全。一共打过58场周赛,其中1场两题,20场三题,剩下ak。手气好时竞赛分最高上到了2531,现在停在了2488。Cf 1706,运气好有两场div2进了前三百(开心 : D)。
来力扣的时候差不多就是三题水平,所以有不止一个网友问过我是不是竞赛出身——不是,什么学科竞赛都没搞过,但我背景确实比较杂。数学转码,转码前学过一点haskell,后来想转行才学的常见oop语言。
我很反感力扣上经常有的“刷一千题就有进步了”这种言论,一是因为我题量不大(第一次上2500的时候不到五百题),二是因为我觉得对大多数人来说这是在鼓励一种对无效努力的自我满足,该cv还是继续cv。如果系统学过数算的话小几百题足以练手,如果做大量题还没很大进步大概率说明基础知识没学明白。就好像英语时态没认全就打算题海战术过gre一样,可以是可以,效率太低。此外一个很简单的道理:只有在舒适区外才能有提升;一天能做出三十题的话,这三十题一定在舒适区内。
特意数了一遍,我除去力扣上的459题,还有hackerrank 33题,codewars 54题,cf 29题,google code jam + kickstart估计不到一百题。总计满打满算700题左右。
这些平台里,codewars是在学数算之前刷的,且大部分是haskell之类。学完数算(berkeley 61b,170和mit 6.046,没做作业所以不算在题量里)之后我就去磕gcj了,当时想的是名次打高一点好拿面试资格。记得很清楚,第一年打gcj round 1c第三题是个数学题,于是运气好以全球六百多的排名进了round 2——那时候属于写个dfs还要查板子的水平。虽然最后也没靠gcj/kickstart拿到面试,但至少对转行多了一点信心。
再后来就来刷力扣了。单从准备面试角度力扣要比gcj/cf适合的多。刷力扣阶段还看了一本很应试的书"Elements of Programming Interviews". 这本书非常好。我感觉算法面试需要的理论知识分成两类,一类是大学基础课学的(比如数据结构的定义、常见算法的证明,这些知识能让人做出裸题),一类是做题用到的通用技巧(差分数组,快慢指针,扫描线,先排序再遍历,各种动归变体等等)。EPI这本书讲了很多常用技巧,省去了大量刷题的时间。
看一些名校网课,算法课经常是分成前后两门的。比如Berkeley的61b和170,mit的6.006和6.046. 一般第二门课讲图(强联通分量、拓扑序、找桥、最大流、一般图最短路等),dp和一些更复杂的东西(线性规划、均摊分析、fft、persistent ds等等),第一门课讲之前的所有东西(堆栈排序二分bfs dfs并查集trie正权图最短路、斐波那契这种最简单的dp等等)。之所以分成两门课以及设置第一门为第二门的前置,一定是因为第二门所需要的抽象化思维能力要多于第一门,而不是相反。而在lc上往往能看见第一门课知识学不会所以去学第二门课的人(所有周赛没拿绿牌就去磕dp和图的,说的就是你们),这个思路很奇怪。在建立了这个共识的基础上,关于上分&准备大厂算法面试,我的一些观点:
先写到这,随缘更