Facebook 工程师总结的 14 种算法面试模式
共 6260字,需浏览 13分钟
·
2021-09-19 03:00
来源:机器之心
咱们在面试程序员岗位时往往需要经历一个编程面试过程,雇主会借此考验面试者的技术实力。然而,这些技术问题有时候却和我们的实际工作并无太大关系,也由此可能给我们的编程面试准备阶段带来很大的压力。曾在 Facebook 和微软工作过的 Educative.io 创始人 Fahim ul Haq 近日发文总结了编程面试所遇到的问题的 14 种最常见的模式,也许能帮你看清各种编程面试问题「背后的真相」。
2.二指针或迭代器
3.快速和慢速指针或迭代器
4.合并区间
5.循环排序
6.原地反转链表
7.树的宽度优先搜索(Tree BFS)
8.树的深度优先搜索(Tree DFS)
9.Two Heaps
10.子集
11.经过修改的二叉搜索
12. 前 K 个元素
13. K 路合并
14.拓扑排序
问题的输入是一种线性数据结构,比如链表、数组或字符串
你被要求查找最长/最短的子字符串、子数组或所需的值
大小为 K 的子数组的最大和(简单)
带有 K 个不同字符的最长子字符串(中等)
寻找字符相同但排序不一样的字符串(困难)
可用于你要处理排序数组(或链接列表)并需要查找满足某些约束的一组元素的问题
数组中的元素集是配对、三元组甚至子数组
求一个排序数组的平方(简单)
求总和为零的三元组(中等)
比较包含回退(backspace)的字符串(中等)
处理链表或数组中的循环的问题
当你需要知道特定元素的位置或链表的总长度时
有些情况不适合使用二指针方法,比如在不能反向移动的单链接链表中。使用快速和慢速模式的一个案例是当你想要确定一个链表是否为回文(palindrome)时。
链表循环(简单)
回文链表(中等)
环形数组中的循环(困难)
如果你被要求得到一个仅含互斥区间的列表
如果你听到了术语「重叠区间(overlapping intervals)」
区间交叉(中等)
最大 CPU 负载(困难)
涉及数值在给定范围内的排序数组的问题
如果问题要求你在一个排序/旋转的数组中找到缺失值/重复值/最小值
找到缺失值(简单)
找到最小的缺失的正数值(中等)
如果你被要求在不使用额外内存的前提下反转一个链表
反转一个子列表(中等)
反转每个 K 个元素的子列表(中等)
如果你被要求以逐层级方式遍历(或按层级顺序遍历)一个树
二叉树层级顺序遍历(简单)
之字型遍历(Zigzag Traversal)(中等)
为当前节点的两个子节点执行两次递归调用以处理它们
如果你被要求用 in-order、pre-order 或 post-order DFS 来遍历一个树
如果问题需要搜索其中节点更接近叶节点的东西
路径数量之和(中等)
一个和的所有路径(中等)
在优先级队列、调度等场景中有用
如果问题说你需要找到一个集合的最小/最大/中间元素
有时候可用于具有二叉树数据结构的问题
查找一个数值流的中间值(中等)
2.向所有已有子集添加第一个数 (1),从而创造新的子集:[[], [1]]
3.向所有已有子集添加第二个数 (5):[[], [1], [5], [1,5]]
4.向所有已有子集添加第三个数 (3):[[], [1], [5], [1,5], [3], [1,3], [5,3], [1,5,3]]
你需要找到给定集合的组合或排列的问题
带有重复项的子集(简单)
通过改变大小写的字符串排列(中等)
2.如果键值(key)等于中间索引处的值,那么返回这个中间位置。
3.如果键值不等于中间索引处的值:
4.检查 key < arr[middle] 是否成立。如果成立,将搜索约简到 end = middle — 15.检查 key > arr[middle] 是否成立。如果成立,将搜索约简到 end = middle + 1
与顺序无关的二叉搜索(简单)
在经过排序的无限数组中搜索(中等)
2.迭代处理剩余的数,如果你找到一个比 heap 中数更大的数,那么就移除那个数并插入这个更大的数
如果你被要求寻找一个给定集合中前面的/最小的/最常出现的 K 的元素
如果你被要求对一个数值进行排序以找到一个确定元素
前面的 K 个数(简单)
最常出现的 K 个数(中等)
2.之后,从该 Heap 取出最小(顶部的)元素,将其加入到合并的列表。
3.在从 Heap 移除了最小的元素之后,将同一列表的下一个元素插入该 Heap
4.重复步骤 2 和 3,以排序的顺序填充合并的列表
具有排序数组、列表或矩阵的问题
如果问题要求你合并排序的列表,找到一个排序列表中的最小元素
合并 K 个排序的列表(中等)
找到和最大的 K 个配对(困难)
2.构建图并找到所有顶点的 in-degree。a)根据输入构建图并填充 in-degree HashMap
3.寻找所有的源。a)所有 in-degree 为 0 的顶点都是源,并会被存入一个队列
4.排序。a)对于每个源,执行以下操作:i)将其加入到排序的列表;ii)根据图获取其所有子节点;iii)将每个子节点的 in-degree 减少 1;iv)如果一个子节点的 in-degree 变为 0,将其加入到源队列。b)重复 (a),直到源队列为空。
处理无向有环图的问题
如果你被要求以排序顺序更新所有对象
如果你有一类遵循特定顺序的对象
任务调度(中等)
一个树的最小高度
逆锋起笔
是一个专注于程序员圈子的技术平台,你可以收获最新技术动态
、最新内测资格
、BAT等大厂的经验
、精品学习资料
、职业路线
、副业思维
,微信搜索逆锋起笔
关注!