互联网技术面试LeetCode刷题指南

从19年秋招的情况来看,互联网公司对于技术序列的朋友要求越来越高,尤其是在代码能力上,越来越多的公司开始在面试中考察LeetCode的easy、medium题型,对于优秀的同学还会考察到hard级别。

也曾经有段子说,程序员第一次去岳父家,开饭前岳父出了一道LeetCode medium,做出来之后才开始动筷子。

不管是所谓的互联网“寒冬”因素,还是企业水涨船高的招聘要求,都对程序员们的数据结构和算法提出了更高的要求,这篇文章和大家一起探讨下刷题这个话题。

  • 为什么要刷题?
  • 如何刷题?
  • 刷题时有哪些技巧?

一、为什么要刷题?

很多人会觉得LeetCode之类的刷题手段似乎没什么意义,只是一种类似八股的考核手段,但其实通过刷题,能够对很多计算机的基础知识有更好的掌握。

之前和一些面试官也聊到这个话题,对于校招生,相对于其它能力,他们更关心学生的基础知识和潜力(聪明程度),所以coding面成为考察这个能力的重要手段。

通过刷题,首先能够对于基础的数据结构有更好的了解,

如果你在大学课程中对于这些掌握的很好,可以直接开始刷题,反之如果你对于这些不是很熟悉,不妨去试试一些口碑不错的网课,快速过一遍基础,这可能比你直接开始刷题要好。

以下三个小部分引用知乎博主 Edward Shi 关于 刷 leetcode 需要哪些基础? 的回答(有删节):

1.1 数据结构

数组,链表,栈,队列,树,图,堆,HashTable,线段树,树状数组,并查集,字典树等

1.2 算法

排序算法(八种),DFS,BFS,二分查找,回溯,分治,递归,动态规划,拓扑排序,贪心等算法(学校学不到的):Sliding window,扫描线算法(图形学),蓄水池算法,flood fill(图形学)等

更难的其实也涉及到很多:KMP,马拉车等

1.3 其他知识

位运算(Bit),基础数据结构实现(LinkedList Deque等实现),一些设计思想(Design),数学知识(Math),通配符,转义字符,记忆化搜索等。如果用的是Java,其实别的语言也一样,Java 还有一些常用的数据结构:TreeMap,TreeSet,PriorityQueue,Deque 等

由此可见,仅LeetCode上涉及到的题目,覆盖范围极广,可以很好的综合考察候选人。

二、如何刷题?

如何刷?每天刷几道?刷什么难度的?按照什么顺序刷?

这样的问题很是常见,我的建议是:

2.1 按照Topics刷题

例如链表、数组、动态规划等,这样

2.2 腾出固定的时间

有些人说我没时间,于是选择坐地铁、搭公交甚至上卫生间的时候看题,我不能说这种做法有什么问题,但在我看来似乎不是很可取 —— 事实上大部分的人远没有那么忙。

放弃一些娱乐活动之类没那么重要的事情,每天固定一个时间段,做计划好的事情,比一些如何省时的哲学要管用很多。

2.3 写不出来就去看答案

有些朋友因为写不出来备受打击,最后放弃继续刷题,这其实不是很好的选择。当你确定没有思路的时候,大胆的去看答案,只要能看懂答案,日后再回顾就ok。很多时候,有些题目不会,不是因为自身问题,而是有些题目就是有特定的套路(前面也提到,有很多这样的算法),一看就懂了,没必要在这些题目上投入过多时间。

直接看答案的前提是经常回顾,看看之前的题目是否还有思路。

写题觉得思路比较复杂的时候,不妨拿纸笔多比划看看。

2.4 不断降低时间空间复杂度

很多题都有很多不同的解法,尽可能找到每道题的最优解,如果一时没有想通,不妨mark之后下次再来回顾。

面试官在面试的时候也会逐步引导你选择最优的算法,以及特定场景最适合的算法。

三、有哪些刷题小技巧?

3.1 最重要的“技巧”:坚持

毛泽东曾经修改了一副对联自勉:贵有恒,何须三更起五更眠;最无益,只怕一日曝十日寒。任何事情坚持最重要,刷题也是如此,计划、理论再丰富,没有时间去支撑,也很难执行好。

3.2 在线编写,避免使用ide

直接编写更能锻炼能力,一部分是编码的能力,另一部分是代码风格,良好的代码风格会让人更愿意共事。例如,如果你习惯使用Java,可以参考阿里的 编码规范,其他亦然。

参考

曹真 wechat
欢迎关注公众号:一时博客