大家好,在这里我想谈谈近年来我是准备算法面试的一些经验。我曾面试过湾区20多家科技公司, 对如何准备面试积累了丰富的经验。尽管近年来系统设计问题越来越普遍,但算法问题仍在面试中占据绝对的主导地位。在电话面试中,几乎100%都是算法题。 onsite面试中最少最少也会有一轮算法题。FAANG公司通常对算法面试有更高的标准,尤其是谷歌将其推向了极致。所以你至少需要将面试准备时间的50%用于准备算法题。如果是面试FAANG,这个比例则应该更高。就我个人而言,我会把准备算法题分为两个步骤。
第一步是学习算法基础。以下是我准备时会看的算法书:
Introduction to Algorithms
Data Structures and Algorithms in Java (如果你用Java编程)
Data Structures and Algorithms in Python (如果你用Python编程)
Algorithms by Robert Sedgewick and Kevin Wayne (这本书里有讲解 Union Find and Trie,本身也是一本很好的算法基础书)
. check 1point3acres for more.需要学习的内容包括:Big O notation, array, linked list, queue, stack, tree (包括 tree structure and tree traversal), binary tree, binary search tree, heap, binary search, depth-first search, breadth-first search, dynamic programming, map, set, graph, union find, and trie (一般公司不会考trie, 但我在 Google 和 Lyft 的面试中遇到过).
在学习了上述所有内容之后,就可以开始第二步,即实践环节,也叫刷题。个人很反感刷题这个说法。我很反感那种机械的很急功近利的刷题。 刷题的目的不在于死记硬背解法,而是总结归纳, 领悟其中的道理。”刷题”的话当然首选LeetCode。我们大多数人都是在职准备面试,所以你的时间很有限,也就是晚上和周末。找到高效的练习方法非常重要。下面我会分享三个练习的经验。
首先,我们需要知道练习的目的是什么?你希望解决尽可能多的问题。与此同时,你要确保真正理解解法。不要在一个问题上花费太多时间, 但也不应该在没有自己先思考解法的情况下立即看答案。所以你需要找到一个平衡。以LeetCode为例,有三个难度级别:简单、中等和困难。我练习时,我为简单、中等和困难问题分别设置了10分钟、15分钟和20分钟的计时器。时间一到,如果我没有任何想法,我就会去马上看解法,并确保我完全理解它。切勿在一个问题上死磕,仅仅为了想靠自己做出来。
第二个经验是,即使你在规定时间内完成了代码并且测试通过了,你也需要查看最优解,并比较最优解和你的解法有何不同。你需要思考为什么最优解比你的解法更好。这会帮助你了解那些最聪明的脑袋是如何处理同样的问题,坚持这个方法将会逐渐改进你的思维过程。. Χ
第三个经验是,对题目进行分类并做笔记。当我完成一个题目时,我会花几分钟时间做笔记。我会记下比如我在哪里卡住了?为什么最优解比我的解法更好?这里分享下我个人使用的Google表格的屏幕截图。它包括四列:Question Link, Category, 1st Try, and Notes。Question Link可以快速打开问题页面。Category是我给这个问题归类的类别。对你做过的题目进行分类非常重要。快速识别问题的类别有助于你快速想出相应的解法,因为相同的类别通常需要类似的思维过程。1st Try记录了我第一次练习这个问题的日期,绿色表示我能够想出最优解并在时间限制内写完代码,红色则相反。最后,在Notes栏中写下任何笔记。此外,你还可以添加更多列来跟踪你第二次、第三次等的表现。
. 1point 3 acres
这三点是我觉得这几年刷题总结出的最宝贵的经验。还有一些其他小技巧。比如在做了大量问题后,你要重新做那些你不太自信的题目, 比如那些你没做出的题目。重新做这些题目能巩固你对解法的理解。另外,对于那些你已经非常熟悉的问题,可以尝试挑战使用其他方法来解决它们。例如,通常不会用动态规划来解决 maximum subarray question ,但此题确实有动态规划的解法。这样做会进一步培养你的思维过程,并在面对新问题时给你更多选择。
这些就是我准备算法面试积累的经验。如果你有其他的tips,或者有在准备过程中需要避免的事情, 请留言分享。 |