我刷了900道吗?
截图如下,力扣主页在这里
所以,前端为什么要刷算法?
首先是保持竞争力。
小厂虽然不考算法,但我现在呆的小厂的前端组长看到我的简历上写着800道力扣题都直言“这个人我一定要招进来。”。
至于其他公司,华为OD都要考算法,更别说字节之类的大厂。
算法只有在面试的时候有用吗?
当然不是! 就个人而言,最近用到算法实现的功能举例如下:
- 实现级联多选框(树的遍历)
- 实现通用的上一步下一步功能(栈,命令模式)
- 使用鼠标框选卡片(223. 矩形面积)
- 找到图形的边缘并实现羽化(海岛问题)
- 使用缓存池对涂抹笔画叠加进行性能优化(哈希表,队列)
毕竟我们不一定总能找到恰好合适的库和组件。 另外,在看源码时算法也是有用的,react的scheduler中用到了堆,VDOM是树,fiber是树转换成的链表。
目标公司和刷题数
个人经验的话,进小厂不用刷,进华为OD大概精刷150道,字节精刷300道,其他公司参照着来。
所以怎么刷?
有人相爱,有人看海,有人卡在力扣第一题出不来。
纯新手的话可以先补充一点基础知识,否则可能连题目都读不懂。非新手也可以看看基础知识补好基础,避免遇到特定题型就跪。
链接见最底下的推荐阅读部分。
个人认为最有效率的刷题法就是一种题型一种题型地刷。
比如链表,刷第一道题你会掌握怎么遍历,刷第二道题你知道怎么用快慢指针,刷第三道题你知道怎么用先导节点,以此类推,只有一种题型一种题型地刷,才能在获得新知识的同时巩固究知识,效率才最高。
《认知觉醒》第四章也提及要有明确的目标,练习时极度专注,能获得有效的反馈,以及始终在拉伸区练习(合适的难度)效率才最高,与其一开始就想一步登天,不如先专注于一种题型,积跬步以至千里。
所以先刷什么题型?刷到什么程度?
入门可以先试一试我列出来的链表题,已经按照难度排序,顺着刷就行:
链表
21.合并两个有序链表
876.链表的中间结点
141.环形链表
160.相交链表
206.反转链表
234.回文链表
203.移除链表元素
83.删除排序链表中的重复元素
19.删除链表的倒数第 N 个结点
2.两数相加(不是两数之和)
328.奇偶链表
143.重排链表
148.排序链表
24.两两交换链表中的节点
61.旋转链表
92.反转链表 II
25.K 个一组翻转链表
其他按着代码随想录目录刷,其中的"数组/哈希表/字符串/双指针法/栈与队列"目录的题目比较少,可以用这个题库作为补充。其他目录的题目都比较全,刷二叉树、回溯算法、贪心算法、单调栈就行。另外,动态规划推荐也看看宫水三叶的动态规划专题 。
面试中图论一般不考,另外贪心算法的题目,往往是你想到了怎么做,你才意识到这是贪心算法。贪心算法的特征是,在做某个判断的时候,无脑选择某种策略就行。比如每次都选最大/小/上/下/左/右的数字,一般是通过反证法来证明这种思路的正确性。
此外,关于排序算法,会默写冒泡排序、插入排序、快速排序、归并排序,然后写几道计数排序的题就行了。
经过一段时间的刷题后,你可能会进入下一个阶段。
风停了,雨晴了,我觉得我又行了
这时候适合去打周赛,刷到1700的周赛分,就可以对任何算法面试都无所畏惧。当然如果有更高的追求,此时也可以找灵神加群,挑战地狱难度。
刷题心法
【稳心态】
遇到题目先不要急,越急越错。
【估题型】
仔细读题,有时题目已经明示你考啥了,看到树就要想到递归,看到第K个就要想到快慢指针、先导节点和堆,看到最大,最小就要想到堆,看到O(logN)就要想到二分法。
【算大O】
有了大概的思路后,就可以计算大O了,也就是时间复杂度和空间复杂度,概念可以问deepseek,解释得很详细。
那么知道自己的解法的时间复杂度之后,怎么知道能不能过呢?首先,计算机大概1s能执行10^8个操作,稳一点按10^7来估计。那么,当你的数据量是1000时,O(N^2)的算法是可行的,因为1000 x 1000也就才10^6,只要代码没问题就能通过。当你的数据量是10^6时,能选的算法只有O(N)和O(1)的算法,而介于这两者之间的数据量,则可以使用O(NlogN)的算法。
【写思路】
当题目比较复杂的时候,建议先写伪代码,将思路理清,能省不少时间。
【转代码】
最后就是将思路转为代码。
【看题解】
题目看不懂很正常,有的题目就是不说人话,题目解不出来也很正常,题解看起来丝毫不费力就搞定了这题,殊不知这背后有多少大佬的多少年的心血,尤其是大名鼎鼎的KMP算法。
想不到也是很正常的,像是动态规划(DP),有线性DP,背包DP,概率DP等多个分类,没刷过类似的题就是不会。像是贪心题,悟到了就是很简单,没悟到那就是搞不定,所以天命人,看攻略是没问题的,死磕只会浪费时间和耐心,很多时候你不是菜,你只是怕了,静下心来,看穿它的套路,其实手到擒来。
推荐阅读
基础知识
代码随想录
《我的第一本算法书》宫崎修一 石田保辉 / 张贝 译
动态规划
其他
致谢
感谢Ulysses童鞋的校对,提供的基础知识推荐以及关于刷题线路的经验。