结束了针对栈结构的定点轰炸,我们现在开始要缓缓过渡到队列的世界了。
关于队列,在算法面试中大家需要掌握以下重点:
- 栈向队列的转化
- 双端队列
- 优先队列
以上考点中,1 属于基础难度, 2 对一部分同学来说已经有点吃力,3 的区分度最高——优先队列属于高级数据结构,其本质是二叉堆结构,考虑到相关题目具有较强的综合性,我们把它放在小册二叉树和堆相关的专题来展开。在本节,我们集中火力向前两个命题点开炮。
# 为什么一道题可以成为高频面试题
⚡ 30 秒速记
- 好面试题两个条件:考的是经典核心知识(公平),知识点密集综合(有区分度)
- 「用栈实现队列」同时考栈、队列、顺序转换和编码基本功,难度适中
- 深度不算高,但前端算法面试偏务实,不追求炫技
- 区分度靠追问拉开:为什么两次逆序能恢复
FIFO、什么时候倒栈、均摊复杂度 - 回答顺序:操作契约 → 为什么顺序对 → 复杂度,别只背代码
一道题能成为高频题,通常是因为它考的是最经典的知识,同时又把好几个知识点压在一道题里,十几分钟就能看出基本功。 「用栈实现队列」就是这样:栈是后进先出、队列是先进先出,你得想到用两个栈倒一下,还得写对什么时候倒、怎么判空。它不难,但前端面试本来就不太考偏题,面试官更关心你基础牢不牢。真正拉开差距的是追问,比如能不能讲清均摊 O(1)。
如何用栈实现队列?这个问题在近几年的算法面试中热度非常高。
所谓“热度”从何而来?这里就引出了一个非常有趣的话题:(在前端算法面试中)什么样的题目是好题?
首先,不能剑走偏锋:好的面试题,它考察的大多是算法/数据结构中最经典、最关键的一部分内容,这样才能体现公平;其次,它的知识点要尽可能密集、题目本身要尽可能具备综合性,这样才能一箭双雕甚至一箭N雕,进而体现区分度、最大化面试过程的效率。
能够同时在这两个方面占尽优势的考题其实并不是很多,“用栈实现队列”这样的问题算是其中的佼佼者:一方面,它考察的确实是数据结构中的经典内容;另一方面,它又覆盖了两个大的知识点、足以检验出候选人编码基本功的扎实程度。唯一的 BUG 可能就是深度和复杂度不够,换句话说就是不够难。
这个特点,在普通算法面试中可能是 BUG,但在前端算法面试中,实在未必。大家要知道,你是前端,你的面试官也是前端,前端行业普遍的算法水平是啥样他心里还没个数吗...... 实际上大多数前端算法面试题的风格都是非常务实的,需要你炫技的实属特殊情况。
💬 面试官追问
-
这题太简单了,能区分出候选人吗?
题目本身区分度一般,区分度在追问里。能当场写对的人很多,能讲清为什么只在输出栈空时才倒、均摊复杂度怎么算的人就少了。
-
面试只剩
15分钟,为什么考这种题而不是动态规划?它短时间内能同时看数据结构理解、代码完整性和复杂度分析。动态规划可能光建模就用完时间,基本功反而看不到。
-
候选人秒写出模板代码,你接着问什么?
问「为什么不能每次
push后都倒过去」「peek和pop怎么复用逻辑」「单次pop最坏是多少、均摊是多少」。背模板的人一般在这里卡住。 -
准备面试时,这类经典题该怎么练?
别只练能
AC,要练能讲:用一两句说清思路,说清为什么对,给出复杂度,再准备一两个变体,比如反过来用队列实现栈。