很多人一提到刷题就慌了。打开LeetCode,看到几百道题,心想我完了。每天刷个三四道,坚持几个月,发现面试还是挂。刷题不是拼数量,拼的是方法。
我见过太多学生了。有人刷了500道,面试被问了一道简单题,卡住半小时。有人只刷了100道,大厂offer拿到手软。差距在哪?在模板。
什么叫模板?就是解题的固定框架。就像你学做饭,先学会切菜、炒菜、煮饭这些基本功,然后任何菜谱都能套用。刷题也是一样,把常见题型的解题框架摸透,遇到新题你也能往里面填。
我整理了一套面试最常用的模板,一共六个。掌握这六个,面试通过率提升80%不夸张。
第一个模板:二分查找。这个模板不是让你背代码,是让你理解它的本质。二分查找的核心是“有序空间里找目标”。不管数组、链表、树,只要数据有顺序,就能用二分。关键点有三个:边界怎么定,循环退出的条件是什么,中间值怎么取。很多人死记硬背,面试官换一个问法就懵了。你要记住,二分查找的核心是不断缩小范围,直到找到答案。把这个逻辑想明白,所有变种题都能解。
第二个模板:双指针。这个模板最实用。数组、链表、字符串,都能用。双指针的核心是两个指针往不同方向移动。一个从头往后,一个从尾往前。或者一个快一个慢。面试里最常见的三数之和、接雨水、合并两个有序数组,全是用双指针。你要记住的是,双指针移动的规则要清晰,什么时候移动左边,什么时候移动右边,条件要写对。
第三个模板:递归与回溯。这个模板很多学生害怕。其实没那么难。递归的核心就两个点:终止条件是什么,递归调用怎么做。回溯就是在递归的基础上加一个撤销操作。比如八皇后问题、全排列、组合总和,都是这个模板。你只要把递归函数的参数设计好,把终止条件写对,剩下的就是枚举所有可能。面试官考递归,多数是为了看你有没有分治的能力。
第四个模板:BFS和DFS。这两个是图论里的基本遍历方法。BFS适合求最短路径,DFS适合找所有路径。很多学生搞不清什么时候用哪个。我给你一个简单规则:需要层序遍历就用BFS,需要深度遍历就用DFS。比如二叉树的最小深度,用BFS。判断图中是否存在环,用DFS。背熟这两个模板的代码结构,遇到图论题直接套。
第五个模板:动态规划。这是面试的大头。动态规划的核心是状态定义和状态转移。你不需要记住所有题的解法,你只需要学会怎么定义状态。一般步骤是:先确定状态是什么,然后写出状态转移方程,最后初始化边界。比如爬楼梯、背包问题、最长公共子序列,全是这个套路。面试官考动态规划,就是想看你有没有化繁为简的能力。
第六个模板:栈和队列。这两个数据结构配合使用,能解决很多看似复杂的问题。比如括号匹配、表达式求值、单调栈。栈的特点是后进先出,队列的特点是先进先出。你只需要记住什么时候用栈,什么时候用队列。处理对称结构、嵌套结构的时候,优先考虑栈。处理顺序结构、缓存问题的时候,优先考虑队列。
有了这六个模板,你刷题的时候就不需要每题都从零想了。看到题目先判断它属于哪类模板,然后套框架。你会发现自己写代码的速度快了很多。面试官也会觉得你思路清晰,逻辑扎实。
我教过的学生里,有一个特别典型。他刷了一个月,每天五道题,结果发现不会的题还是不会。我让他停下来,花一周时间把六个模板彻底搞懂。第二个月再用模板刷题,他告诉我现在看每道题都能知道面试官想考什么。后来他去了字节跳动。
刷题不是目的,通过面试才是。你把时间花在盲目刷题上,不如花在理解模板上。理解一个模板,相当于掌握了五十道题的解题思路。这笔账很划算。你不需要把所有题都刷完,你只需要把模板用到滚瓜烂熟。
面试的时候,考官不会在乎你刷了多少题。他只在乎你能不能写出正确的代码,能不能清楚地解释你的思路。用模板答题,你的思路天然就是清晰的。每一步都有依据,不是靠猜。
我推荐你现在就行动起来。打开LeetCode,找几道你之前不会的题。不要急着看答案,先想它属于哪个模板。用模板的思路去解,你会发现没想象的那么难。等你把六个模板都用熟练了,再去刷那些难题。这个时候你已经有底气了,不会轻易被带偏。
记住,面试不考做题机器,考的是有方法的人。
夜雨聆风