写在离开力扣前
已注销
1521
2022.12.03
发布于 未知归属地

2021年9月开始刷题,10月开始打周赛,录播过一阵子也混过一些群(灵佬还是很佬的,可惜群里wsn太多,被恶心退了)。可以负责任的说我过的每一场面试都要感谢力扣。短期内不想刷题了,所以走之前也给社区回馈一个数据点/性价比刷题的一些经验吧。

(tldr: 先学算法数据结构再刷题 & 两千分前放过dp吧求求你们了)

免责声明:我只关心面试找工作+力扣随便上上分,编程竞赛与我无关。下文一切观点的前提都是以面试找工作为目的刷题。

Screenshot 2022-12-03 at 12.09.45.png

战绩如图,见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和图的,说的就是你们),这个思路很奇怪。在建立了这个共识的基础上,关于上分&准备大厂算法面试,我的一些观点:

  1. 多打周赛,把周赛当模拟面试机会。虽然当然分越高越好,但我觉得2400对于面faang来说差不多够了。2400以上短板大概率是沟通技巧,接收信息和提示的水平,和表达能力,以及最重要的运气。
  2. 基础概念要扎实,比如判断算法复杂度
  3. 如果周赛不能稳定1-2题,要么是缺乏最基本的编程知识(哈希表是什么?xor是什么?),要么是缺乏逻辑思维和解决问题的能力(忘掉编程这件事,当智力题解能不能做出来?),这时候应该找些资料系统入门一下,你的瓶颈不会是dp。不用像这位一样试图教育宫水dp定义是什么。
  4. 如果周赛不能稳定3题,可能是第一门课级别的基础算法没学全,可以按照lc标签/网课大纲查漏补缺;也可能是手慢,手慢只能靠多刷题或者转python。你的瓶颈也不会是dp,尤其是在lc近一年第三题不能更水的情况下。
  5. 如果周赛不能稳定4题,要么是这两个月周赛难度回来了,要么是手慢,要么是该磕dp了。但是无论如何瓶颈不会是最大流或kmp。这个阶段我也没过,就不多说了。
  6. 一场faang的技术面,45分钟去掉寒暄读题和结束时的提问环节,做题+测试只有三十分钟多一点。还要先讲思路获得认可再开始写。所以实际上思考时间最多只有五分钟左右。这种情况下不可能出特别难/需要很复杂的板子的题。绝大部份是mid/hard之间的难度,写起来(python)不会超过一百行。准备面试没必要拿偏题怪题当假想敌。
  7. 打周赛不需要考虑最优空间复杂度,但面试需要

先写到这,随缘更

评论 (13)