扣友们在准备技术面试时,《剑指 Offer》应该是最常出现的备战资料之一,也确实有许多人通过它拿到了自己的 Dream Offer。那这本书的创作者本人,又是怎样学习算法和数据结构的呢?
今天,力扣君邀请到了《剑指 Offer》的作者何海涛老师,来分享一下他的学习方法和编程面试准备心得。
为什么想写《剑指 Offer》?
无论是计算机科班的应届毕业生,还是已经有几年工作经验的程序员,找工作时都需要进行一轮接一轮的面试,而编程面试则是其中的重头戏。
从我这十几年对程序员编程面试的观察,我的结论是面试的难度在逐年增大,大家准备面试所花费的时间和精力也越来越多。
几年前要是听说谁为了准备面试刷了 200 道力扣题 😱,大家都会惊为天人。现在每个应聘者都在刷题,应届毕业生准备面试刷 400 题基本上只能算是起步 🤔。由于应聘者刷题越来越熟练,程序员面试的标准自然也在水涨船高。
但我个人不喜欢也不建议题海战术。我们真正需要的是 系统学习 并 深刻理解 不同数据结构及算法的特征以及适用场景。
在真正掌握了每个数据结构及算法的精髓之后,针对典型的面试题进行必要的练习,那么在面试的就能以不变应万变,不管遇到什么样的面试题都能迎刃而解。帮助读者系统学习并深刻理解不同数据结构及算法的特征以及适用场景,是最近写作《剑指 Offer:数据结构与算法精讲》这本书的初衷,帮助读者在算法面试中能快速找到解题思路并写出高质量的代码,则是我写这本书的目的。
算法和数据结构到底应该怎么学?
学习数据结构,首先要熟练掌握插入、删除、查找等基本操作,这些基本操作往往是解决很多面试题的关键。
例如,如果我们熟练掌握了前缀树的插入和查找操作,那么很多跟字符串前缀相关的问题都很容易解决。再比如,基于基础数据结构如哈希表、链表等设计更加高级、复杂的数据结构(例如最近最少使用缓存)是近年来非常流行的面试题。其实这类题目也都是利用基础数据结构来实现高级数据结构的插入、删除、查找等操作
同样,对于基础算法我们也需要深刻理解它们的原理以及实现的代码。
例如,二分查找通常只需要 10 行左右的代码就能实现,我们要理解它的循环条件的比较运算符什么时候是“<”,什么时候是“<=”,确定下一步应该查找前半部分或者后半部分的标准是什么。理解了这些原理之后,不管面试题怎么变化,只要面试题是关于在排序(可能只是部分排序)数组中的查找问题,都可能基于二分查找解决,而最终解决问题的代码都大同小异。
此外,学习数据结构还要深刻理解每种数据结构的特点及其适用场景,这样才能在面试中合理选择数据结构解决问题。
例如,哈希表是时间效率非常高的数据结构,它的插入、删除、查找操作的时间复杂度都是 O(1)。既然时间效率这么高,那是不是不管什么问题都能用哈希表解决?其实未必。
如果存储的元素是字符串,而且需要根据字符串的前缀进行查找,那么前缀树是更好的选择。如果存储的元素是数字,并且解决问题需要知道数据集合里的最大值或者最小值,那么堆可能是更好的选择。如果需要对动态数据集合排序,并且需要根据数值的大小查找,那么平衡的二叉搜索树(Java 中的 TreeSet 或者 TreeMap)可能是更好的选择。
同样,学习算法也要理解每种算法的特点及其适用场景
例如回溯法和动态规划适合解决的问题看起来很类似。如果解决一个问题需要多个步骤,并且每个步骤都面临多个选择,那么我们可以考虑使用回溯法或者动态规划解决这个问题。如果问题要求列举出问题所有的解,那么我们应该采用回溯法解决问题。如果问题只是要求计算某个最优解(通常是最大值或者最小值)或者计算解的数目(或者判断解是否存在),那么我们应该采用动态规划解决问题。
举例而言,给你一个没有重复数字的正整数集合,请找出所有元素之和等于某个给定值的所有组合。同一个数字可以在组合中出现任意次。如果面试官要求我们列举出所有可能的集合,那么这是一个考查回溯法的问题。如果面试官要求我们计算符合条件的集合里最少包含几个数字,即计算某个最优解,那么这就变成了一个考查动态规划的问题了。
编程面试怎么准备?
在准备面试时,要注重总结常用的解题思路
例如,如果一个面试题提到与二叉树层相关的概念,那么我们可以尝试用广度优先搜索算法解决这个问题。再比如,如果关于图的问题关注的是路径的最短距离,那么可以采用广度优先搜索解决;如果面试题重点关注的是路径本身,那么可能深度优先搜索算法更加适合用来解决问题。
同时也建议大家在准备面试时注重总结常用的代码模板
有一些经典的数据结构或者算法的实现代码,我们可以将它们当作模板用来解决很多相关的面试题。只要我们能够理解这些模板里代码的来龙去脉,这样在面试中如果遇到类似的问题就能套用相应的模板解决,轻松做到举一反三。例如用并查集解决跟图相关问题时合并和查找操作的代码都大同小异,在合适的时候套用 union 和 findFather 两个函数就能解决很多与图相关的问题。
准备编程面试不是一件轻松的事情。但如果我们既能深刻理解单个数据结构和算法的原理以及实现代码,并能横向比较不同数据结构和算法的特点以及应用场景,注意总结常用的解题思路和代码模板,那么必定能顺利通过面试并最终拿到心仪 Offer。
当然,光说不练终究是纸上谈兵,想要真正系统学习和深刻理解面试必备的算法与数据结构知识,那就来「剑指 Offer 学习计划
」练习一下吧。告别题海,掌握高效学习方法。

👇 即刻点击图片,加入计划吧!
学习计划是力扣新推出的高效提升工具,每个计划以天为单位,根据不同学习主题规划题目任务,通过“有计划性”的练习帮你快速掌握相关知识,还能养成每日打卡的好习惯。
何海涛老师的新书《剑指 Offer:数据结构与算法精讲》现已上架,6 折优惠中,欲购从速~
继续阅读
阅读原文