编码 面试
对于许多开发人员来说,编写采访编码的过程会引起焦虑。 涉及的内容太多 ,常常感觉很多与开发人员在日常工作中所做的事情无关,这只会增加压力。
结果之一是,开发人员现在通常花数周的时间在LeetCode等网站上浏览数百个面试问题。 在面试之前,我谈到的焦虑症开发人员最常见的观点之一是: 我是否解决了足够的练习题? 我还能做更多吗?
这就是为什么我尝试着重于帮助开发人员掌握每个问题背后的潜在模式的原因 -因此他们不必担心解决数百个问题而遭受Leetcode疲劳的困扰。 如果您了解通用模式,则可以将它们用作模板来解决无数微小变化的其他许多问题。
在这里,我列出了可用于解决任何编码面试问题的前14种模式,以及如何识别每种模式以及每种模式的一些示例性问题。 这只是触及表面-我强烈建议您查看“ Grokking编码面试:编码问题的模式” 以获得全面的解释,示例和编码实践。
以下模式假定您已经精通数据结构。 如果还没有,请查看有关数据结构的这些复习课程 。
让我们开始吧!
1.推拉窗
滑动窗口模式用于对给定数组或链接列表的特定窗口大小执行所需的操作,例如查找包含全1的最长子数组。 滑动窗口从第一个元素开始,一直向右移动一个元素,并根据要解决的问题调整窗口的长度。 在某些情况下,窗口大小保持不变,而在其他情况下,窗口大小会增大或缩小。
![](https://i-blog.csdnimg.cn/blog_migrate/7f639389913b0d4da821b26e943159ff.png)
以下是一些可以确定给定问题可能需要滑动窗口的方式 :
- 问题输入是线性数据结构,例如链表,数组或字符串
- 要求您找到最长/最短的子字符串,子数组或所需的值
您将滑动窗口模式用于以下常见问题:
- 大小为“ K”的最大和子数组(简单)
- 带有“ K”个不同字符的最长子字符串(中)
- 字谜(硬)
2.两个指针或迭代器
“两个指针”是一种模式,其中两个指针串联遍历数据结构,直到一个或两个指针都达到特定条件。两个指针在排序数组或链表中搜索对时通常很有用; 例如,当您必须将数组的每个元素与其他元素进行比较时。
需要两个指针,因为仅使用一个指针,您将不得不不断地循环遍历数组以找到答案。 用单个迭代器来回进行此操作对于时间和空间复杂度而言效率低下-一种称为渐近分析的概念。 尽管使用1个指针的强力或幼稚的解决方案将起作用,但它会产生类似于O(n²)的东西。 在许多情况下,两个指针可以帮助您找到具有更好空间或运行时复杂性的解决方案。
![](https://i-blog.csdnimg.cn/blog_migrate/b44d0694d46042c2e0b5f3c2fa8f4df2.png)
确定何时使用“两指针”方法的方法:
- 在处理排序数组(或链接列表)并且需要找到一组满足某些