面试编程题模式总结

  1. 滑动窗口
    应用场景:
    (1) 输入是线性数据结构,比如链表,数组,字符串
    (2) 问题是找到最长或者最短的子串或者找到一个期望值
    典型案例:
    (1) 给定长度为k,求和最大的子数组
    (2) 有‘k’个不同字符的最长的子字符串
    (3) 字符串回文构词法
  2. 双指针
    应用场景:
    (1) 从有序数组(链表)中找到一组满足特定约束的元素
    (2) 这一组元素要么是二元组,要么是三元组,甚至多元组
    典型案例:
    (1) 求有序数组的平方
    (2) 找到和为0的三元组
    (3) 比较包含回车的字符串
  3. 快速指针和慢速指针(慢指针在一圈内一定会与快指针相遇)
    应用场景:
    (1) 问题是解决链表或者数组内的循环
    (2) 寻找一个链表中的某个特定的元素或者求链表的总长
    典型案例:
    (1) 循环链表
    (2) 回文链表
    (3) 循环数组中的圈
  4. 合并区间(如果存在重叠区间需要找出这些重叠区间或者合并区间)
    应用场景
    (1) 生成没有交集的列表
    (2) 重叠区间
    典型案列
    (1) 区间交集
    (2) 最大的CPU负载
  5. 循环排序(给定一定范围内的连续数)
    应用场景
    (1) 涉及到给定范围内的数字的有序数组
    (2) 在有序或者轮转数组中找到缺失或者重复或者最小的数
    典型案例
    (1) 找到缺失的数
    (2) 找到缺失的最小正数
  6. 链接链表最佳翻转方案(在一定的限制条件下翻转链表,比如不能使用额外的空间)
    应用场景:不能使用额外的空间的情况下翻转链表
    典型案列
    (1) 翻转子链表
    (2) 翻转子链表的每k个元素
  7. 广度遍历树(基于广度优先搜索技术遍历树,在跳到下一层级之前使用队列来记录当前层的所有节点,判断条件为队列是否为空)
    应用场景:涉及到层次遍历树
    典型案列
    (1) 二叉树的层次遍历
    (2) 之字形遍历
  8. 深度遍历树(基于深度优先检索技术遍历树,可以使用递归或者栈,判断条件为当前节点是否是叶子节点)
    应用场景
    (1) 前序,中序或者后序遍历树
    (2) 需要搜索接近叶节点的一些任务
    典型案列
    (1) 求树中值的和为特定值的路径
    (2) 满足某些条件的路径的条数
  9. 双堆(涉及二叉搜索)
    应用场景
    (1) 优先队列,调度场景
    (2) 从一个集合中找到最大,最小,居中的元素
    (3) 以二叉树结构为特征的问题
    典型案列:找到一个序列的中值
  10. 子集
  11. 改进的二叉搜索(找出某个确定的元素,最好的方法就是二分搜索)
    应用场景
    (1) 无序的二叉搜索
    (2) 在一个有序的无穷的列表中搜索
    典型案列
    一般的解答方法
    (1) 找到中位数
    (2) 如果查找的数等于该中位数,返回该中位数;如果查找的数小于该中位数,搜索列表的前面部分;否则搜索列表的后面部分
  12. 前k个元素
    应用场景
    (1)从给定的集合中找出最大的(最小的,最常出现的)前k个元素的问题
    典型案列
    (1) 前k个数
    (2) 前k个频繁出现的数字
    一般解答方法
    (1) 往小顶堆插入k个元素
    (2) 遍历剩余的元素,如果发现一个比堆内的其中一个数据大时,移除堆顶元素,并将当前数插入
  13. K路合并
    应用场景
    (1) 以有序数组,列表或者矩阵为特征的问题
    (2) 合并有序列表,或者是查找有序列表的最小元素的问题
    典型案列
    (1) 合并k路有序列表
    (2) 可以得到最大和的k个数对
    解题的一般方法
    (1) 将每个队列的第一个元素都插入小顶堆
    (2) 取出堆顶(最小)元素,将其添加到合并的列表内
    (3) 从堆顶移除最小的元素过后,将与移除元素相同的列表内的下一个元素插入堆
    (4) 重复第二步和第三步,生成合并后的有序列表
  14. 拓扑排序
    应用场景
    (1) 处理没有环的图
    (2) 问题涉及按顺序更新所有对象
    (3) 存在遵循特定顺序的一类对象
    典型案列
    (1) 任务调度
    (2) 树的最小高度
    解题的一般方法
    (1) 初始化:使用hashmap将图形存储在相邻列表中,找到所有的源节点,并使用hashmap保存节点的度数
    (2) 创建图并求得所有顶点的入度:根据输入创建图,并填充节点的度数
    (3) 找到所有的源节点:标记为“O”的节点为源节点,将这些节点存储到队列
    (4) 排序:对每个源节点,执行以下操作(将它添加到源节点,从图中获得无它所有的孩子节点,将每个孩子节点的度数减少1,如果孩子节点是源节点,将其加入源节点队列),重复上一步,直到源节点的队列为空
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章