提交 178339af 编写于 作者: W wizardforcel

2022-11-19 11:29:20

上级 e8823337
# 介绍
\ No newline at end of file
# 软件工程师面试:你需要准备的一切
> 原文:[https://www . techinterviewphandbook . org/software-engineering-interview-guide/](https://www.techinterviewhandbook.org/software-engineering-interview-guide/)
<header>
没有人有时间去研究成百上千的 LeetCode 问题,好消息是你不需要做那么多就能得到 FAANG 的工作!
我对自己在东南亚拼车公司 Grab 的工作感到沮丧,想打入 FAANG,但不知道该怎么做。经过几个月的研究、学习和实践,我面试了 11 家公司,并设法获得了湾区顶级科技公司的 9 份邀请——脸书、谷歌、Airbnb、Palantir、Dropbox、Lyft 和一些初创公司。这是一个乏味的过程,我再也不想经历了。我经历了这个过程,但有了这个指南,你就不必经历了。
本指南将提供一个关于如何准备软件工程师面试的顶级技巧的**快速概述——包括技术性和非技术性面试。在相关的地方,您可以通过访问这篇概述文章中的链接或通过网站的左侧边栏来深入了解更多细节。**
如何准备你的软件工程面试:
1. 最大化你入围的机会
2. 找出面试形式
3. 选择一种编程语言
4. 为面试提高你的计算机科学基础
5. 编码面试练习
6. 准备系统设计面试(针对中高级水平)
7. 准备行为面试
8. 谈判一揽子报价
## 最大化你入围的机会[](#maximize-your-chances-of-being-shortlisted "Direct link to heading")
你是否仍然难以进入一些或所有顶尖科技公司的候选名单?你的简历可能是个问题。
你的简历是进入 FAANG / MANGA 等大型科技公司候选名单的唯一最重要的切入点。在入围之后,你过去的成就与你的编码面试技巧相比变得明显不那么重要了——正如我们所知,这是可以有条不紊地学习的。因此,能够很好地描述你过去的成就以通过筛选阶段是非常重要的。
不幸的是,即使是我个人认识的最合格的候选人,也不知道如何写好简历,没能入围。事实是,当我们中的许多人没有进入 FAANG / MANGA 这样的顶级科技公司的候选名单时,我们往往会认为自己不够资格——但在大多数情况下,这可能只是缺乏良好的框架。
如果你想学习如何写一份好的软件工程师简历,我在这里为谷歌、脸书、亚马逊、网飞、苹果等公司写了一份关于软件工程简历准备的逐步指南,并附有例子供你参考。
## 找出面试形式[](#find-out-the-interview-format "Direct link to heading")
在你的软件工程师面试中,你可能会遇到各种各样的面试形式(从早期到后期):
### 1.测验[](#1-quiz "Direct link to heading")
频率:偶尔
测验是第一轮筛选,是一种快速而肮脏的方式来淘汰非常弱(甚至是非技术性的)的候选人。它们是结构化的问题,有明确的答案,这使得它们可以由招聘人员/非技术人员或自动评分员来管理。它们通常在流程的早期完成。
示例:
* 什么是 4 & 5(二进制)?答案:4
* 冒泡排序的时间复杂度是多少?答案:O(n <sup>2</sup>
### 2.在线编码评估[](#2-online-coding-assessment "Direct link to heading")
频率:偶尔
像测验一样,在线编码评估通常在过程的早期进行。给出了一个具有良好形式的输入和输出的算法问题,期望候选人在在线编码接口中编写代码来解决该问题。 [HackerRank](https://www.hackerrank.com) 是一个非常常见的进行在线编码评估的平台。LeetCode 是在线编码评估中解决问题的一个好方法。然而,在 HackerRank 中,通常期望您编写从 stdin 读取并打印到 stdout 的代码,如果候选人不熟悉 API,这可能会出错。
### 3.带回家作业[](#3-take-home-assignment "Direct link to heading")
频率:罕见
关于问算法问题是否是评估个人能力的好方法,已经有过无数次辩论,因为它们并不是日常工作中最相关的技能。带回家作业是一种旨在解决算法面试缺点的形式,通过让候选人从事更大的项目,允许他们展示软件设计技能。
然而,这种面试形式会占用应聘者和公司更多的时间,因此在拥有大量应聘者的大公司中并不常见。这种形式在创业公司和小公司中更常见。例子
* 构建航班列表应用程序
* 构建看板应用程序
* 构建一个蛇游戏
### 4.电话屏幕面试[](#4-phone-screen-interviews "Direct link to heading")
频率:常见
电话面试是最常见的形式,每个候选人在面试时至少会遇到一次。你将被要求通过电话或网络电话(蓝战士/Skype/谷歌视频聊天)与面试官交谈。我们会给你一个问题,你将使用在线协作编辑器(CoderPad/CodePen/Google Docs)来处理这个问题。
即使编辑器支持执行,通常也不允许执行代码。所以不要依赖它来验证你的解决方案的正确性。根据你申请的职位不同,格式会略有不同。很多公司喜欢使用 [CoderPad](https://coderpad.io) 进行协同代码编辑。CoderPad 支持程序的运行,因此可能会要求您修改代码,以便它可以运行。对于前端面试,许多公司喜欢使用 [CodePen](https://codepen.io) ,这将是值得你花时间熟悉这种基于网络的编码环境的用户界面。
在你的电话筛选面试之前,看看[编码面试最佳实践](/coding-interview-cheatsheet/)以及该做和不该做的事情。
### 5.现场[](#5-onsite "Direct link to heading")
频率:几乎总是
如果你已经走到这一步,恭喜你!这通常是要约决定前的最后阶段。进入现场阶段的候选人将需要在办公室进行面对面的面试。如果你是海外候选人,公司甚至会让你飞过去,并支付你的住宿费。
现场阶段通常包括多轮(编码、系统设计、行为),预计持续几个小时。由于你在现场,你可能会被要求与面试官一起做白板练习,通常是解决算法问题或系统设计问题。也有可能你不得不带上自己的笔记本电脑,在现场做一个项目/解决一个编码问题。
对于小型(非上市)公司的现场面试,大多数会允许(也更喜欢)你使用自己的笔记本电脑。因此,提前准备好开发环境非常重要。
如果公司提供午餐,你也可以和员工共进午餐,这样你可以更多地了解公司文化。
## 挑选一种编程语言[](#pick-a-programming-language "Direct link to heading")
完成简历后,软件工程面试的下一步很简单,不会花很长时间——决定编程语言。除非你面试的是像移动或前端这样的专家职位,那里有特定领域的语言,否则在算法编码面试中,你应该可以自由使用任何你想要的语言。
大多数时候,你心里已经有一个了——选一个你用得最多、用起来最舒服的。编写面试代码最常用的编程语言是 Python、Java、C++和 JavaScript。我不建议仅仅为了编写面试代码而学习一门全新的语言,因为需要一段时间(平均至少几周)才能熟练掌握一门语言,并在面试环境中自如运用,这本身就已经够紧张的了。我个人选择的编程语言是 Python,因为它非常简洁,而且标准库提供了函数/数据结构。
阅读更多关于编程语言的编程面试:[选择一种编程语言](/programming-languages-for-coding-interviews/)
## 面试编码 [](#study-and-practice-for-coding-interviews "Direct link to heading") 的学习与练习
下一步也是最重要的一步是练习用你选择的编程语言解决算法问题。虽然破解编码面试是一个很好的资源,但我更喜欢通过实际解决问题来学习。
有许多平台可以用于此——如 LeetCode、HackerRank 和 CodeForces。从我的个人经验来看,LeetCode 问题最适合面试准备,而 HackerRank 和 CodeForces 更适合竞争性编程。
然而,LeetCode 有成千上万的问题,不知道从哪里开始,或者如何组织你的练习可能会令人畏缩。我在这里提供了建议的准备计划和结构化资源:
### 编码面试学习计划[](#coding-interview-study-plan "Direct link to heading")
对于更全面的准备,建议留出 3 个月的时间(每周 11 小时,即每天 2-3 小时)进行编码面试准备。我在这里分享了我的 [3 个月学习计划,它提供了一个包含资源和练习问题的编码面试主题列表,你应该每周按照优先顺序完成。我也将很快添加关于推荐的 1 个月和 1 周学习计划的内容。](/coding-interview-study-plan/)
如果你有不到 3 个月的准备时间,你可以使用 [Grind 75 工具](https://www.techinterviewhandbook.org/grind75)(由我开发)生成你自己的学习计划,它会根据你剩下的时间为编码面试生成推荐的学习计划。其背后的算法包括按优先级对问题进行排序,以及平衡所涵盖主题的广度和深度。
### 练习中使用的资源[](#resources-to-use-in-your-practice "Direct link to heading")
在市场上,有大量的资源争夺你的注意力,大量的资源只是争夺你的钱,但不提供任何价值。如果我必须区分优先顺序,这些是我会依次使用的顶级编码面试准备资源:
1. [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
2. [算法怪兽](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
3. 我的(免费)编码面试最佳实践指南
4. 我的(免费)编码面试技巧指南
5. 我的(免费)算法学习指南
#### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
除了通过实践和易于理解的指南帮助你掌握重要的编码面试数据结构和算法问题,AlgoMonster 还有一个额外的好处,即综合[种常见面试问题模式](https://algo.monster/problems/stats),你可以用它们来解决你以前从未遇到过的任何其他问题。与 LeetCode grinding 的非结构化性质相比,这绝对是一个高质量的平台。数据结构和算法问题涵盖了所有常见语言——Python、Java、C#、JavaScript、C++、Golang 等等。 [**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
#### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
这个由设计大师设计的课程扩展了推荐练习题中的问题,但是从问题模式的角度来进行练习,这是一个我也同意的学习方法,我个人也使用这个方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**今天获得终身访问权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
#### 我的(免费)编码面试最佳实践指南[](#my-free-coding-interview-best-practices-guide "Direct link to heading")
如果你读过顶级科技公司使用的[编码面试评估规则](/coding-interview-rubrics/),你可能会被评估项目的数量以及如何始终如一地展示招聘行为所淹没。
这份[编码面试最佳实践指南](/coding-interview-cheatsheet/)综合了在你的编码面试之前、之中和之后应该做什么的可行建议,以展示招聘信号。
我建议在你练习编写面试问题的时候,记住并使用这个指南——以确保你从一开始就培养好的习惯和肌肉记忆。
#### 我的(免费)编码面试技巧指南[](#my-free-coding-interview-techniques-guide "Direct link to heading")
有没有一个结构化的方法可以增加你找到编码面试问题好的解决方案的几率?如何优化你的方法的时间和空间复杂度?我的《编码面试技巧指南》教你一些处理你以前从未遇到过的问题的技巧——比如问题可视化、手工解决、将问题分解成子问题等等。
#### 我的(免费)算法研究备忘单[](#my-free-algorithms-study-cheatsheets "Direct link to heading")
我不确定这些是否有资格成为一个深入的指南——它们更像是一页纸的“学习备忘单”,包含了**最佳学习资源、最佳练习的 LeetCode 问题和需要记住的事情**。然而,他们确保你涵盖所有最重要的理由,尤其是当你没有时间。因为这些也是帮助我获得顶级技术报价的笔记——它们绝对有效。
更多关于编码面试准备的小技巧,在这里参考我的[完整编码面试准备指南](/coding-interview-prep/)
### 尝试模拟编码面试(与谷歌和脸书的工程师)[](#try-out-mock-coding-interviews-with-google-and-facebook-engineers "Direct link to heading")
在你的面试官面前编写代码可能是一个令人伤脑筋的经历,尤其是如果你以前从未做过的话——这就是获得实践经验如此重要的原因。
[interview . io](https://iio.sh/r/DMCa)是目前市场上最好的模拟技术面试资源。它允许你与真正的谷歌和脸书工程师预约模拟编码面试,尽管是匿名的。你甚至可以预约特定职位的面试,比如移动、前端、工程管理。更好的是——如果你想更容易地过渡到现实世界的编码面试——你可以观看录制的面试,看看电话面试是什么样的。
此外,如果你在模拟面试中表现出色,你将能够打开“工作页面”,让你直接预约像优步、Lyft、Quora、Asana 等顶级公司的面试。我作为面试官和被面试者都使用过[interview . io](https://iio.sh/r/DMCa)并发现这种体验非常棒。
## 准备系统设计面试[](#prepare-for-the-system-design-interview "Direct link to heading")
如果你是一个中级或高级水平的候选人,你可能会期望系统设计问题作为你的技术面试的一部分。它们没有被 LeetCode 充分覆盖,好的资源仍然很难获得。
系统设计面试的目标是评估候选人设计涉及多个组件的真实软件系统的技能。
### 利用最好的系统设计面试准备资源[](#utilize-the-best-system-design-interview-preparation-resources "Direct link to heading")
一些最好的系统设计面试准备资源包括:
1. [ByteByteGo](https://bytebytego.com?fpr=techinterviewhandbook)——这是亚马逊上的畅销书《系统设计访谈书》的作者 Alex Xu 的一门新的系统设计课程。该课程涵盖系统设计基础知识,然后深入研究 10 多个著名常见产品的设计(如[设计 YouTube](https://bytebytego.com/courses/system-design-interview/design-youtube) 、脸书 Newsfeed 等)和多个大数据和存储系统的设计(如[设计聊天系统](https://bytebytego.com/courses/system-design-interview/design-a-chat-system))。对于每一个深入的潜水,概念的解释和全面的图表使用,使它非常容易接近任何资历水平。
2. 设计大师的“探索系统设计面试”——这可能是互联网上最著名的系统设计面试课程,它与大多数其他课程的不同之处在于,它完全是基于文本的,这对于喜欢阅读而不喜欢看视频的人(比如我自己)来说非常好!).它包含一个流行的系统设计问题库,以及一个系统设计基础术语表。我个人已经完成了这个课程,并推荐了许多其他人来使用它。强烈推荐!
3. 由 Exponent 主讲的[“系统设计面试课程”——该课程涵盖了系统设计的基础知识,并拥有一个包含模拟面试视频的流行系统设计问题的庞大数据库。有些问题有文本答案、数据库模式和 API 供参考(我觉得很有帮助)。虽然订阅系统设计访谈内容可能有点贵,但他们也为](https://www.tryexponent.com/courses/system-design-interview?ref=techinterviewhandbook)[数据结构](https://www.tryexponent.com/courses/swe-practice?ref=techinterviewhandbook)、[算法](https://www.tryexponent.com/courses/algorithms?ref=techinterviewhandbook)[行为访谈](https://www.tryexponent.com/courses/behavioral?ref=techinterviewhandbook)提供高质量的技术内容。涵盖技术面试准备所有方面的一站式平台的便利性非常诱人。
4. 设计大师们的“探索高级系统设计面试”——我没试过这个,但它是由创作“探索系统设计面试”的同一批人写的,所以应该不错!在我看来,你可能不需要这个,除非你非常资深或者想要一个专家职位。
[点击此处查看其他系统设计准备指南和资源。](/system-design/)
## 准备行为面试[](#prepare-for-the-behavioral-interview "Direct link to heading")
每家顶级科技公司都至少有一轮针对软件工程师的行为面试。通常,软件工程师的行为面试包括:在简历中分享以前经历的细节,提供过去情况和行为的例子,展示某些行为特征(如冲突管理、数据驱动),分享抱负和职业规划
尽管这些面试看起来“松散”或无组织,但实际上有一种结构化的方法来准备行为面试:
### 1.知道回答它们的星形格式[](#1-know-the-star-format-for-answering-them "Direct link to heading")
星形格式有助于你组织行为问题的答案。这最适用于需要你讲述过去经历或行为的问题。情境:分享产生任务的情境的细节任务:解释你需要实现的目标或你必须解决的问题,重点关注范围、严重性或具体基准或你必须达到的结果行动:解释你为实现目标做了什么,描述你有哪些选择以及你是如何做出决策的结果:描述你行动的结果以及你学到了什么
阅读更多:回答行为问题的星形格式
### 2.练习软件工程师最常见的行为问题[](#2-practice-the-most-common-behavioral-questions-for-software-engineers "Direct link to heading")
参考[软件工程师最常见的 30 个行为问题](/behavioral-interview-questions/)
关于行为面试准备的更多建议,请参考我的[完整行为面试准备指南](/behavioral-interview/)这里。
## 谈判软件工程师报价包[](#negotiating-the-software-engineer-offer-package "Direct link to heading")
最后,面试前你绝对需要准备的最后一件事是软件工程师的薪资谈判。在面试过程中的任何时候,关于薪水的话题都有可能出现。我们还有关于[谈判策略](/negotiation/)[软件工程师薪酬](/understanding-compensation/)的深度指南。
以上就是我的全部内容——关于软件工程师面试准备过程中每一步的更多细节,请通过侧边栏或导航到下一页来深入了解我的手册中的每个主题!
</header>
\ No newline at end of file
# 获得面试机会
\ No newline at end of file
# 撰写 FAANG-ready 软件工程师简历实用指南
> 原文:[https://www.techinterviewhandbook.org/resume/](https://www.techinterviewhandbook.org/resume/)
<header>
不知道为什么你仍然没有被一些或所有顶级科技公司列入候选名单?你的软件工程师简历可能是个问题。
作为一名 FAANG 面试官,我阅读了大量的软件工程简历,即使是我所知道的一些最合格的候选人也因为糟糕的简历而未能进入候选名单。大多数人犯的错误是立即认为他们不够资格,但这可能与事实相去甚远。
幸运的是,要写一份好的软件工程师简历,你可以完成一些具体的步骤和要求。从你的简历结构、内容,到你可以用来测试简历的免费工具,我整理了一份非常简明的最佳实践总结,来准备你申请 FAANG 软件工程职位的简历:
1. 设置 ATS 友好的简历模板
2. 以有意义的顺序用框架良好的内容填充你的模板
3. 用优先级和关键词优化你的简历
4. 使用免费工具测试简历
## 如何建立一份 ATS 友好的软件工程师简历[](#how-to-set-up-an-ats-friendly-software-engineer-resume "Direct link to heading")
大多数候选人可能没有意识到的是,大多数顶级科技公司正在使用某种形式的申请人跟踪系统(ATS)来解析和筛选成千上万份简历,甚至在它们到达人眼之前。在许多公司,ATS 甚至会使用某些规则来自动拒绝候选人。
虽然不同的公司可能使用不同类型的自动测试系统,但确保你的软件工程师简历被大多数自动测试系统顺利阅读是可能的。这一部分确保你的简历至少完全可以被 ATS 阅读,而接下来的几部分会增加你通过 ATS 筛选的机会。
Expert tip
[FAANG Tech Leads](https://www.faangtechleads.com?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=ats_template&aff=1e80c401fe7e2) 目前在**以 70%的价格提供简历模板和示例**
他们的模板:
* 是由前 FAANG 招聘经理根据从数百份候选人申请中收到的顶级简历创建的
* 通过 FAANG ATS 保证可读性
* 迎合不同的经验水平
他们还提供了已经收到 FAANG 公司多份聘书的候选人的简历示例/参考资料,这有助于帮助你制作符合相同要求的内容。[来看看](https://www.faangtechleads.com?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=ats_template&aff=1e80c401fe7e2)
### 仅使用 Microsoft Word 或 Google Docs 创建和编辑您的简历[](#only-use-microsoft-word-or-google-docs-to-create-and-edit-your-resume "Direct link to heading")
**待办事项**
* 提交 PDF 格式的简历以保留格式,但一定要用微软 Word 或谷歌文档创建。确保简历中的文字易于突出很重要,这是易于解析的先决条件。
* ATS 工具总是试图提高标准简历格式的可读性,因此简历格式越普通越好。
* 为了最大化简历上的空间,不要使用页眉或页脚,减少页边距——窄的页边距每边 0.5。
**不要做**
* 不要使用 Photoshop、其他图形设计工具或在线简历制作工具来制作你的简历
* 不要在 Word/Google 文档中使用页眉或页脚部分——减少页边距,只在正文中写信息。
### 仅使用可读尺寸的标准字体[](#only-use-standard-fonts-of-readable-sizes "Direct link to heading")
新字体可以将字母转换成 ATS 不可读的特殊字符。你应该使用的字体- **Arial,Calibri,Garamond**
确保你的字体大小在以后的招聘过程中仍然可读——为了可读性,使用最小的字体大小 **10px**
### 添加带有标准标题和排序的章节[](#add-sections-with-standard-headings-and-ordering "Direct link to heading")
ATS 的读者需要从你的简历中识别和分析标准类型的信息。使用标准的标题和排序可以帮助他们做得更好。
这是招聘人员推荐的对我很有效的顺序:
| 部分 | 标题名称 |
| --- | --- |
| 专业总结 | (使用简历标题作为章节标题,例如“在谷歌有超过 5 年领导团队经验的高级软件工程师”) |
| 联系信息 | "联系信息" |
| 技能——编程语言、框架等。 | “技能” |
| 经验 | “工作经验” |
| 教育程度(注意:如果你还在上学或者工作经验不足 3 年,你可以把教育放在第一位) | “教育” |
| 项目 | "项目" |
| 其他可选部分-例如证书、奖励等 | “奖项和荣誉”/“认证”/“奖项、荣誉和认证” |
caution
不要在标题中添加符号,以避免 ATS 可读性问题。
## 如何写好软件工程师简历内容[](#how-to-write-good-software-engineer-resume-content "Direct link to heading")
由于软件工程就其所需的技能和经验而言本质上不同于其他职业,对软件工程师简历的内容期望也是独特的。下面的每一段都将涵盖软件工程师在简历中通常需要的内容:
### 软件工程师如何写专业总结[](#how-to-write-a-professional-summary-for-a-software-engineer "Direct link to heading")
一个好的专业总结可以改变游戏规则。它不仅能以单个部分无法做到的方式总结你的整个职业经历,还能给招聘经理留下一个愉快的印象。
根据我作为一名软件工程面试官的个人经验,我强烈推荐专业的摘要,因为面试官通常没有时间阅读细节——因此,直接说明为什么候选人非常适合这份工作的摘要会大大提高他们吸引注意力的机会。
以下是我写一份优秀的软件工程简历的最佳技巧。
#### 开始之前:列出你的最佳卖点[](#before-you-start-list-down-your-best-selling-points "Direct link to heading")
从你的整个职业经历中,列出符合你申请的工作描述的最重要的几点。这可以包括工作经验或技能。
#### 把卖点总结进你的简历总结[](#summarize-the-selling-points-into-your-resume-summary "Direct link to heading")
尽可能地总结卖点,将它们组织成 50 字以内的简短总结:
确保您做到以下几点:
* ✅回答为什么你很适合这份工作
* ✅使用主动语态
* ✅使用行动语言
* ✅:以描述你工作角色的名词开始,例如“软件工程师”、“前端工程师”
#### 为你的简历摘要写一个标题[](#write-a-headline-for-your-resume-summary "Direct link to heading")
不要把“专业总结”写成章节标题,把你的经验进一步凝练成 10 个字以内的大标题。把它当成你 LinkedIn 个人资料标题的一个稍微精致一点的版本。一些例子”
##### 软件工程师(全栈)[](#software-engineer-full-stack "Direct link to heading")
具有 X 年全栈 web 开发经验的软件工程师,专攻 Ruby on Rails 和 PostgreSQL。由于在多家电子商务公司工作过,成为电子商务和支付领域的领域专家。
##### 高级前端工程师[](#senior-front-end-engineer "Direct link to heading")
前端工程师,在前端技术方面有 X 年的经验和坚实的基础。喜欢建立可扩展的网络基础设施和快速制作网站。对编程语言、编译器和开发工具充满热情。
##### 软件工程主管[](#software-engineering-lead "Direct link to heading")
软件工程师,在后端、扩展复杂的分布式系统和各种云平台方面有 X 年的经验。在两家公司领导超过 5 个平均规模为 6 人的工程团队,并指导超过 20 名初级成员。
##### 大学四年级 X[](#senior-at-university-x "Direct link to heading")
X 大学四年级学生,重点研究人工智能和机器学习(ML)。在 X 公司实习,从事全栈开发和 ML 工程工作。
info
阅读更多关于如何让你的专业总结在 [FAANG Tech Leads 的简历手册](https://www.faangtechleads.com/resume/professional-summary)中脱颖而出的信息。
### 如何给软件工程师写联系方式[](#how-to-write-contact-information-for-a-software-engineer "Direct link to heading")
#### 必备[](#must-haves "Direct link to heading")
* 姓名(应包含在简历的最顶端)
* 个人电话号码
* 千万不要在这里写上你的工作电话号码
* 位置-城市、州、邮政编码
* 刚好够招聘人员确定你是本地还是国际候选人
* 电子邮件地址
* 永远不要把你的工作邮件放在这里
* 如果你使用其他电子邮件服务,我推荐 Gmail
* LinkedIn 个人资料
#### 富裕阶层[](#good-to-haves "Direct link to heading")
* GitHub 个人资料 URL
* 个人网站 URL
* 堆栈溢出配置文件 URL
* 中等配置文件 URL
* 竞争编码配置文件
* 厨师长
* HackerRank(黑客等级)
如果信息之间需要分隔符,请使用“|”或制表符
在相关情况下,指出编码平台的成就,例如最高评级、排名、星级数、徽章。
info
使用[FAANG Tech Leads ' s Resume Handbook](https://www.faangtechleads.com/resume/contact-information)阅读更多关于获取联系信息部分的信息。
### 软件工程师如何写技能[](#how-to-write-skills-for-a-software-engineer "Direct link to heading")
包括编程语言和技术堆栈:
结构,如下所示:
> 【技能总结】 : 【列举技能用“|”隔开】
* 编程语言——如果令人印象深刻,包括你所写的行数,例如“超过 10,000 行”
* 结构
* 数据库
info
点击[FAANG Tech Leads ' s Resume Handbook](https://www.faangtechleads.com/resume/skills)阅读更多关于准确列出你的技能的信息。
### 软件工程师如何写工作经历[](#how-to-write-work-experience-for-a-software-engineer "Direct link to heading")
用熟悉的格式,倒序列出你的工作经历。列出的每项工作都应具备:
公司、地点、职位、工作持续时间遵循以下结构
> 【公司或组织】,【地点】 | 【职务】 | 【起止日期格式为 MM/YYYY】
例子
> 新加坡脸书|前端工程主管| 2018 年 8 月至今
主要成就列表,包括:
* 工作范围和所需技能
* 按照这一结构列出的成绩
* T0, T1, Achievement Summary, T2: T3, Action and T4 lead to T5, Quantifiable Results, T6 and T7.
info
[FAANG Tech Leads ' s Resume Handbook](https://www.faangtechleads.com/resume/work-experience)上阅读更多关于如何更好地展示你的运输工作经历的信息。
### 如何给一个软件工程师写学历[](#how-to-write-education-for-a-software-engineer "Direct link to heading")
大多数软件工程工作至少需要本科学位。然而,除非你是一名应届毕业生或者没有太多的工作经验,否则它不应该优先于你的工作经验。
使用以下格式,删除不相关的信息:
> 【学位名称】、【毕业年份-未毕业写预计毕业日期】
> 【大学名称】、【地点】
> GPA:X . XX/4.0(3.50/4.00 以上列出 GPA,5 分制下 4.3 以上列出)
> 列出关键成绩,包括领导岗位、技能、社团、项目、奖项等。
示例:
> 2015 届
> 新加坡国立大学计算机科学学士,新加坡
> GPA: 3.82 / 4.00(优等生)
> 院长名单,毕业生代表
> 黑客协会主席
info
阅读更多关于在 [FAANG Tech Leads 的简历手册](https://www.faangtechleads.com/resume/education)上书写你的教育历史的信息。
### 软件工程师如何写项目[](#how-to-write-projects-for-a-software-engineer "Direct link to heading")
包括至少两个你参与过的项目,概述你的主要贡献。总是尝试将你的项目名称链接到 GitHub 或者招聘经理可以查看你的项目的地方。
> Facebook/Docusaurus
> Docusaurus v2 的维护者和首席工程师,Docusaurus v2 是一个静态站点生成器,为 Meta 的许多开源项目——React Native、Jest、Relay、Reason 等——的文档提供支持。GitHub 上 7.6k >项目使用。
### 如何为软件工程师撰写奖励、荣誉和证书[](#how-to-write-awards-accolades-and-certifications-for-a-software-engineer "Direct link to heading")
只包括与工作申请相关的成就,并尝试量化你的成就。一个好的格式是
> 【年份】【量化】 【竞争】
例子
> 2016 年| 50 个团队的最佳全能产品|脸书黑客马拉松
info
[FAANG Tech Leads ' s Resume Handbook](https://www.faangtechleads.com/resume/projects)上阅读更多关于有效展示你的项目的信息。
## 用关键词 [](#optimize-your-resume-with-keywords "Direct link to heading") 优化你的简历
优化内容的必备条件:
### [少即是多](#less-is-more "Direct link to heading")
**待办事项**
* 在简历中突出几个你最好的成就比包含许多“一般”的成就要好
* 简历只用一页纸
**不要做**
* 不要不经筛选就列出你所有的成就来展示更多的成就
### 关键词优化[](#keyword-optimization "Direct link to heading")
想象一下,你是一名招聘经理或招聘人员,一边筛选简历,一边还要应付工作中的许多其他任务——你根本没有太多时间来处理每份简历!当招聘经理看简历时,他们实际上是在快速扫描他们看重的技能或经验的关键词,然后才额外关注你的简历。
招聘人员和 ATS 也是这样做的,但基于招聘经理帮助撰写的职位描述。这就是为什么根据工作描述优化你的简历是非常重要的。
info
一些 ATS 会根据你简历中某个关键词的出现频率来决定你技能的强度,而其他 ATS 会根据某项技能在你简历中的位置来评估它的经验。
例如,如果你以前的工作经验是 3 年,你提到处理搜索引擎营销(SEM),ATS 将假设 5 年的 SEM 经验。
#### 在你的简历中加入职位描述的关键词[](#include-keywords-from-job-descriptions-into-your-resume "Direct link to heading")
你应该经常分析职位描述中必须具备和必须具备的技能或经验,并确保将关键词添加到你的简历中。
把它们放在“技能”部分,在“工作经验”和“教育”部分加入相同的关键词。确保严格模仿工作描述中的语言。
记住也要包括常用缩写的完整版本。例如亚马逊网络服务代替 AWS,谷歌云平台代替 GCP。
然而,不要为了填充关键词而填充——永远记住,简历最终会被招聘人员或招聘经理看到的。
#### 优化关键词频率和位置[](#optimize-keyword-frequency-and-placement "Direct link to heading")
分析职位描述并确定每个技能和经验的重要性,然后根据其重要性优化关键字的频率。
Expert tip
虽然为每一个应用程序进行优化是理想的,但你可以将你的简历概括为一种类型的职位。
1. 整理 3 到 5 份该职位的工作描述
2. 将它们复制粘贴到一个`.txt`文件中,并上传到一个免费的“单词和短语”频率工具中,如 [Online-Utility.org 的文本分析器](https://www.online-utility.org/text/analyzer.jsp),以识别经常使用的关键词
3. 将你拥有的技能和经验融入简历中
## 查看简历的免费工具[](#free-tools-to-review-your-resume "Direct link to heading")
我推荐使用这些免费工具来优化你的简历:
### 1.免费简历审核[](#1-free-resume-review "Direct link to heading")
《技术面试手册》有一个[简历审核门户](https://app.techinterviewhandbook.org/resumes),你可以上传简历,从其他社区成员甚至是《技术面试手册》的作者那里获得有用的评论和反馈!
如果你愿意花一些钱,我们推荐 [FAANG Tech Leads 的简历审查服务](https://www.faangtechleads.com?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=ats_template&aff=1e80c401fe7e2),你的简历将由前 FAANG 招聘经理和工程师审查,而不是由不懂技术的随机撰稿人审查。
### 2.使用行业标准 ATS [](#2-test-readability-with-industry-standard-ats "Direct link to heading")测试可读性
测试你的简历的可读性和格式。大多数大公司都使用这样的简历扫描仪。
### 3.纯文本文件测试[](#3-the-plain-text-file-test "Direct link to heading")
只需从简历中复制内容并粘贴到纯文本文档中即可!在以下情况下进行编辑:
* 你的原始简历中缺少一些要点
* 纯文本中的字符显示不正确
* 各部分杂乱无章
## 最终提示[](#final-tips "Direct link to heading")
### 不要轻视求职申请表[](#do-not-take-job-application-forms-lightly "Direct link to heading")
如果你应聘的公司要求你在自己的表格中填写“工作经历”和“学历”部分,千万不要掉以轻心!大多数情况下,这些都是内部人力资源应用程序,帮助分析工作申请,并从提供的信息中筛选出候选人。事实上,你的简历可能从来没有被招聘人员或招聘经理看到过——只有你填写在他们表格中的信息!
### 不适用于同一公司的多个职位[](#do-not-apply-to-many-jobs-at-the-same-company "Direct link to heading")
ATS 还允许招聘人员查看你申请的公司的所有职位。尽量不要申请太多的工作,因为招聘人员不会知道你是否真的感兴趣,或者你是否对自己的能力有自知之明。例如,在同一家公司申请软件工程师和数据科学家的职位不是一个好主意。
* * *
这就是我对简历准备的看法——希望这对你有所帮助!如果你有任何关于技术面试手册的其他建议想与他人分享,请通过[contact@techinterviewhandbook.org](mailto:contact@techinterviewhandbook.org)联系我,或者创建一个新的 [GitHub 讨论项目](https://github.com/yangshun/tech-interview-handbook/discussions)
<figure>![Summary of the 4 steps to create a great software engineering resume, in checklist format](../Images/106b916aa5c46b84071d57ebb091e90f.png "Summary checklist of the four key steps to create a great software engineering resume")
<figcaption>Summary checklist of the four key steps to create a great software engineering resume</figcaption>
</figure>
</header>
\ No newline at end of file
# 编码面试准备
\ No newline at end of file
# 编码面试:你需要准备的一切
> 原文:[https://www . techinterviewphandbook . org/coding-interview-prep/](https://www.techinterviewhandbook.org/coding-interview-prep/)
<header>
如何有效准备软件工程技术面试的终极指南——编码测试。
如果你已经决定开始准备编码面试的艰苦过程,并且你不知道如何最大限度地利用你的时间,这是你在编码测试中从零到英雄的唯一指南。
## 什么是软件工程编码面试?[](#what-is-a-software-engineering-coding-interview "Direct link to heading")
编码面试是一种技术面试的形式,通过向潜在的软件工程师候选人提出编程问题来评估他们的能力。通常情况下,编码面试的重点是数据结构和算法,而其他技术回合可能包括[系统设计](/system-design/)(特别是对中高级候选人)
一轮编码面试通常需要 30 - 45 分钟。面试官将向您提出一个(或多个)技术问题,要求您在 CodePen 或 CoderPad(电话屏幕/虚拟现场)等实时协作编辑器中或白板(现场)上编写代码,在 30-45 分钟内解决问题。
## 在编码面试中你会被如何评价?[](#how-will-you-be-evaluated-during-a-coding-interview "Direct link to heading")
我整理了顶级科技公司的评估标准,并将其归纳为一个你可以使用的[编码面试评估标题](/coding-interview-rubrics/)。具体术语或权重可能因公司而异,顶级科技公司在评估中总是包括以下标准:
1. **沟通** -提出澄清性的问题,清楚地交流方法和权衡,这样面试官就不会感到困惑。
2. **解决问题** -理解问题并系统、逻辑、准确地解决问题,讨论多种可能的方法和权衡。能够准确确定时间和空间的复杂性,并对其进行优化。
3. **技术能力**——将讨论过的解决方案翻译成工作代码,而没有明显的困难。干净、正确的实现,具有丰富的语言结构知识。
4. **测试** -能够针对正常情况和极端情况测试代码,自动纠正代码中的问题。
阅读更多关于[在展示招聘信号的编码面试中你应该如何表现](/coding-interview-cheatsheet/)
## 如何最好地准备编码面试?[](#how-to-best-prepare-for-a-coding-interview "Direct link to heading")
LeetCode 本身实际上不足以让你为编码面试做好准备。一头扎进 LeetCode,并认为你可以完成所有成千上万的问题,这是对你时间的浪费,而且永远不会像结构化方法那样让你做好准备。
假设每个问题 30 分钟,平均每天练习 3 小时,一般人将只能在 3-4 周内完成 160 个问题,并且可能不会内化正确的方法或记住他们以前练习过的问题。
相反,这是如何准备你的软件工程师编码面试:
1. 选择一种好的编程语言来使用
2. [计划好你的时间,按照重要性的顺序处理话题和问题](#plan)
3. [结合单个题目的学习和练习](#study-and-practice)
4. [在练习的同时编写面试备忘单,将必须做的事情和必须记住的事情内在化](#practice-with-cheatsheets)
5. [准备好自我介绍和最后的问题](#prepare-self-introduction)
6. [尝试模拟编码面试(与谷歌和脸书的工程师)](#mock-interviews)
7. [(如果你有多余的时间)记住关键技术面试问题模式](#question-patterns)
### 1.挑选一门好的编程语言来使用[](#pick-programming-language "Direct link to heading")
用于编写面试代码的好的编程语言是你熟悉的,并且适合面试的语言。
是什么决定了面试是否应该使用编程语言?一般来说,我们希望高级语言有许多标准的库函数和数据结构,因此“更容易”编码。
推荐用于编码面试的编程语言:Python,C++,Java,JavaScript
在这里阅读更多关于选择编程语言的考虑。
### 2.计划好你的时间,按照重要性的顺序处理话题和问题[](#plan "Direct link to heading")
编码面试需要准备多长时间?这实际上取决于你想做多充分的准备。平均来说,完成最低限度需要大约 [30 个小时,做好充分准备需要大约 100 个小时](/coding-interview-study-plan/)
要开始准备你的编码面试,总是从一个计划开始。计算一下从现在到编码测试那天,你还有多少时间来为面试做准备,仔细地计划一下你每天要涉及的主题和问题,首先把最重要的放在首位。
但是你怎么知道在你剩下的时间里哪些是最重要的话题和问题需要练习呢?你可以使用免费的 [Grind 75 工具](https://www.techinterviewhandbook.org/grind75)(由我制作),它可以为不同长度的准备时间生成编码面试研究计划。其背后的算法包括按优先级对问题进行排序,以及平衡所涵盖主题的广度和深度。
如果你有充裕的时间准备,建议花 3 个月左右的时间(每天 2-3 个小时)做更全面的准备。我想出了一个[个人 3 个月学习计划](/coding-interview-study-plan/),从头到尾带你完成哪些题目和问题。
### 3.结合单个主题 [](#study-and-practice "Direct link to heading") 的学习和练习
为了记忆的保持和效率,最好是针对单个概念进行学习,然后立即做该题目的相关练习题。
幸运的是,已经有很好的编码面试准备资源,可以让你非常容易地、系统地做这件事:
1. [算法怪兽](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
2. [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
#### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
除了通过实践和易于理解的指南帮助你掌握重要的编码面试数据结构和算法问题,AlgoMonster 还有一个额外的好处,即综合[种常见面试问题模式](https://algo.monster/problems/stats),你可以用它们来解决你以前从未遇到过的任何其他问题。与 LeetCode grinding 的非结构化性质相比,这绝对是一个高质量的平台。数据结构和算法问题涵盖了所有常见语言——Python、Java、C#、JavaScript、C++、Golang 等等。 [**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
#### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
这个由设计大师设计的课程扩展了推荐练习题中的问题,但是从问题模式的角度来进行练习,这是一个我也同意的学习方法,我个人也使用这个方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**今天获得终身访问权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### 4.伴随实践的是编写面试备忘单,以便将必做事项和必须记住的事项[](#practice-with-cheatsheets "Direct link to heading")
为了最大化你从实践中获得的东西,我建议你在学习和实践时参考下面的编码面试备忘单*:*
* 编码面试技巧:如何找到解决方案并优化你的方法
* 编码面试最佳实践:如何在面试中表现出招聘信号
* **算法学习备忘单**:涵盖了最好的学习资源,必须记住(提示、边角案例)并且必须做每一种数据结构和算法的练习题
#### 编码面试技巧[](#coding-interview-techniques "Direct link to heading")
这里有大约 10 个技巧的列表来做你在编码面试中需要做的 2 件最重要的事情:找到解决问题的方法,优化你的方法的时间和空间复杂度。
当你面对从未遇到过的问题时,这些技巧非常有用,可以帮助你走出困境。
#### 编码面试最佳实践[](#coding-interview-best-practices "Direct link to heading")
顶级科技公司根据 4 个主要标准评估候选人:沟通、解决问题、技术能力和测试。为了展示符合这些标准的行为,我准备了一份[编码面试最佳实践备忘单](/coding-interview-cheatsheet/),它概述了你在编码面试之前、之中和之后应该做的事情。这是基于我作为一名受访者的个人经历,以及我作为一名脸书面试官对顶级候选人的观察。
使用这个指南来伴随练习可以确保你从一开始就培养良好的习惯和肌肉记忆。
#### 算法研究编码面试备忘单[](#algorithms-study-cheatsheets-for-coding-interviews "Direct link to heading")
这些其实是我自己整理的笔记,为自己的编码面试准备的。我已经把它们整理成了 1 页的最佳学习资源,最佳 LeetCode 练习题,以及每种数据结构和算法的必读内容(技巧,边角案例)。它们确保你将最重要的概念内化,并从准备中获得最大收益。[检查它们](/algorithms/study-cheatsheet/)
### 5.准备好自我介绍和最后的问题[](#prepare-self-introduction "Direct link to heading")
在任何软件工程面试的开始和结束时,自我介绍和最后要问的问题几乎总是必需的。因此,你应该花些时间精心准备一份精彩的自我介绍和一系列要问的最后问题。如果做得好,这些可以给面试官留下一个好印象,让事情变得对你有利。
要获得最好的软件自我介绍示例和技巧,请查看这个[软件工程师自我介绍指南](/self-introduction/)。在这个[期末问题指南](/final-questions/)中,还可以查看向软件工程师提问的最佳期末问题的样本。
### 6.尝试模拟编码面试[](#mock-interviews "Direct link to heading")
在你的面试官面前编写代码可能是一个令人伤脑筋的经历,尤其是如果你以前从未做过的话——这就是获得实践经验如此重要的原因。
[interview . io](https://iio.sh/r/DMCa)是目前市场上最好的模拟技术面试资源。它允许你与真正的谷歌和脸书工程师预约模拟编码面试,尽管是匿名的。你甚至可以预约特定职位的面试,比如移动、前端、工程管理。更好的是——如果你想更容易地过渡到现实世界的编码面试——你可以观看录制的面试,看看电话面试是什么样的。
此外,如果你在模拟面试中表现出色,你将能够打开“工作页面”,让你直接预约像优步、Lyft、Quora、Asana 等顶级公司的面试。我作为面试官和被面试者都使用过[interview . io](https://iio.sh/r/DMCa)并发现这种体验非常棒。
点击阅读更多关于[不同模拟编码面试平台的信息。](/mock-interviews/)
### 7.(如果你有多余的时间)内化关键技术面试问题模式[](#question-patterns "Direct link to heading")
许多编码面试解决方案实际上涉及一组相似的关键模式——学习它们将有助于你解决编码面试常见问题之外的任何长尾问题。
#### AlgoMonster[](#algomonster-1 "Direct link to heading")
出互联网上的资源——algo monster 是 Google 工程师打造的优秀平台。它使用数据驱动的方法将软件工程编码面试问题浓缩成一组关键模式,并将其总结成一门结构化、易于消化的课程。想象一下 LeetCode,但是只有你需要知道的关键模式。
最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用并获得终身访问权。[立即加入,享受七折优惠→](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
#### 寻找编码面试:编码问题的模式[](#grokking-the-coding-interview-patterns-for-coding-questions-1 "Direct link to heading")
这个由设计大师设计的课程扩展了推荐练习题中的问题,但是从问题模式的角度来进行练习,这是一个我也同意的学习方法,我个人也使用这个方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案。
学习和理解模式,而不是背答案![立即加入,享受九折优惠→](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
* * *
以上就是我的全部内容——关于软件工程师编码面试准备过程的每一步的更多细节,请通过侧边栏或导航到下一页来深入了解我的手册中的每个主题!
</header>
\ No newline at end of file
# 使用哪种编程语言编写面试代码
> 原文:[https://www . techinterviewphandbook . org/programming-languages-for-coding-visities/](https://www.techinterviewhandbook.org/programming-languages-for-coding-interviews/)
<header>
你用来编写面试代码的编程语言重要吗?答案是肯定的。
大多数公司让你用任何你想要的语言编码——我知道的唯一例外是谷歌,他们只允许候选人在他们的算法编码面试中选择 Java、C++、JavaScript 或 Python。
然而,你所做的选择对你的表现的影响比你想象的要大得多——这就是为什么在你准备编码面试的早期选择一种合适的编程语言是很重要的——并在实践中经常使用。
在决定使用哪种编程语言时,有 3 个考虑因素:
1. 适合面试
2. 你对这门语言的熟悉程度
3. 例外
## 1.是否适合面试[](#1-suitability-for-interviews "Direct link to heading")
有些语言更适合面试——像 Python 或 Java 这样的高级语言提供了标准的库函数和数据结构,可以让你更容易地将解决方案转换成代码。
从我面试的经验来看,大部分应聘者都会选择 Python 或者 Java。其他常见的语言包括 JavaScript、Ruby 和 C++。我绝对会避免像 C 或 Go 这样的低级语言,原因很简单,因为它们缺乏许多标准的库函数和数据结构,有些可能需要手动内存管理。
就我个人而言,Python 是我在算法编码面试中事实上的选择,因为它简洁并且有一个巨大的函数库和数据结构。Python 还使用一致的 API 来操作不同的数据结构,比如`len()``for ... in ...`和序列上的切片符号(字符串/列表/元组)。获取序列中的最后一个元素是`arr[-1]`,反转它只是`arr[::-1]`。用 Python 中最少的语法可以完成很多事情。
Java 也是一个不错的选择,但是必须不断地在代码中声明类型意味着额外的击键,这会导致更多的输入,这不会带来任何好处(在面试环境中)。当你在现场面试中不得不在白板上书写时,这个问题会更加明显。选择/不选择 C++的理由和 Java 差不多。最终,Python、Java 和 C++是不错的语言选择。
* 推荐:Python,C++,Java,JavaScript
* 可接受(但如果你熟悉的话更倾向于推荐):Go、Ruby、PHP、C#、Swift、Kotlin
* 避免:Haskell,Erlang,Perl,C,Matlab
* 你一定是疯了:脑残,集会
## 2.你对语言的熟悉程度[](#2-your-familiarity-with-the-language "Direct link to heading")
大多数时候,建议你使用一门你非常熟悉的语言,而不是仅仅为了在面试中使用而学习一门新的语言。
如果你有时间限制,仅仅为了面试而学习一门新语言并不是一个好主意。语言需要时间来掌握,如果你已经把大部分时间和精力花在修改/掌握算法上,就几乎没有多余的精力来掌握一门新语言了。如果你熟悉使用一种主流语言,就没有理由仅仅为了面试而学习一种新的语言。
如果你已经在工作中使用 Java 有一段时间了,但没有时间熟悉另一种语言,我建议你坚持使用 Java,而不是为了面试而从头开始学习 Python。这样做,你可以避免在工作和面试时不得不在不同语言间切换。大多数时候,瓶颈在于思考,而不是写作。在一个人能够流利地使用一种语言之前,需要一些时间来适应它。
学习一门新语言的正当理由:
* 面试要求使用该语言(特定领域的角色,如移动/前端/数据科学)
* 你并不急于开始面试
学习一门新语言的糟糕理由:
* 你面试的公司大量使用这种语言,你想给面试官留下深刻印象/显示你很适合
* 你想展示你是时尚的
## 3.异常[](#3-exceptions "Direct link to heading")
允许你“选择任何你想要的编程语言”的惯例的一个例外是当你面试一个特定领域的职位时,比如前端/iOS/Android 工程师角色,你需要分别熟悉 JavaScript、Objective-C/Swift 和 Java 的编码。如果你需要使用一种语言不支持的数据结构,比如 JavaScript 中的队列或堆,也许可以试着问面试官你是否可以假设你有一种数据结构,它实现了特定时间复杂度的特定方法。如果数据结构的实现对解决问题并不重要,面试官通常会同意。实际上,了解现有的数据结构并选择合适的数据结构来解决手头的问题比了解复杂的实现细节更重要。
</header>
\ No newline at end of file
# 编写面试学习计划——根据剩余时间学习和练习什么
> 原文:[https://www . techinterviewphandbook . org/coding-interview-study-plan/](https://www.techinterviewhandbook.org/coding-interview-study-plan/)
<header>
在开始准备编码面试时,需要回答的一个最重要的问题是:为了最有效地准备编码面试,你应该做哪些研究课题和练习题?
互联网上有大量的资源,但很难知道它们如何适应你剩下的准备时间。谢天谢地,这篇文章将帮助你解决这个问题。
我亲自经历过几次可怕的软件工程师面试过程,并准备了自己的学习计划,每次都加以完善。
在这篇文章中,我将分享我个人用来准备编码面试的 3 个月学习计划。您将找到要学习的确切主题(带有推荐链接)和要练习的确切问题(带有练习链接)。
## 建议的准备时间和方法[和](#recommended-preparation-time-and-approach "Direct link to heading")
你需要多少时间来准备你的编码面试?一般来说,3 个月(如果你能每周投入 11 个小时)是更全面准备的推荐时间。我将分享 3 个月的推荐学习计划(推荐期),但你可以通过 Grind 75 工具(由我构建)为任何时间框架的练习题生成学习计划。更多的选项,如按难度过滤,主题,可选择的问题分组可以在那里找到。
不管你有多长时间,如果你不熟悉核心数据结构和算法知识,建议你在开始编码面试问题练习之前复习一下。不同的人有不同的练习方式,你应该做最适合你的。各种可能的方法有:
1. 广度优先准备——复习每个话题,然后开始练习所有话题的各种问题。如果你有大约一个月的空闲时间,这一策略是值得推荐的。
2. 深度优先准备——一次处理一个话题——修改一个话题的材料,练习该话题的大量问题。在确保掌握了一个话题之后,继续下一个话题。对所有或选定的主题重复上述步骤。如果你没有太多时间,这可能是最好的准备方式。您可以专注于我们推荐的学习计划中的高优先级主题。
3. 先深度后广度的准备——一次处理一个话题——为一个话题修改材料,为这个话题练习几个问题。确保掌握之后,进入下一个话题。对所有主题重复上述步骤。最后,练习所有主题的各种问题。这个策略比其他的要花更多的时间,所以如果你有一个月以上的时间的话,推荐使用。
我个人推荐的是**广度优先准备****深度优先然后广度准备**。在你的时间表中安排一些广度的学习/练习是很重要的,这样当你继续后面的话题时,你就不会忘记前面的话题。
## 3 个月学习计划-包含推荐学习资源和练习题链接[](#the-3-month-study-plan---with-recommended-study-resources-and-practice-question-links "Direct link to heading")
在每个学习计划中,你会发现一个包含资源和练习问题的编码面试主题列表,你应该每周按照优先级顺序完成**。**
为了更好地利用它,你应该创建一个模板,将每天的剩余日期和剩余时间分解,这样你就可以在以后填写每天要涉及的主题/问题。
保持相对保守的估计,这样你就不会筋疲力尽。
### 第 1 - 4 周:专题学习+练习[](#week-1---4-topical-study--practice "Direct link to heading")
这些都是你应该研究的课题,按优先顺序排列。链接的学习资源是我的算法备忘单——它概述了必须记住的内容,如时间复杂性、极限情况、特定主题的有用技术,以及基本的和推荐的练习题。
在你练习的早期,不要忘记应用[编码面试最佳实践](/coding-interview-cheatsheet/)中的行为和[编码面试技巧](/coding-interview-techniques/)中的方法!
#### 第一周[](#week-1 "Direct link to heading")
| 主题 | 优先 | 所需时间 |
| --- | --- | --- |
| [数组](/algorithms/array/) | 高的 | 2 小时 |
| [字符串](/algorithms/string/) | 高的 | 3 小时 |
| [哈希表](/algorithms/hash-table/) | 中间的 | 3 小时 |
| [递归](/algorithms/recursion/) | 中间的 | 3 小时 |
#### 第二周[](#week-2 "Direct link to heading")
| 主题 | 优先 | 所需时间 |
| --- | --- | --- |
| [分类和搜索](/algorithms/sorting-searching/) | 高的 | 3 小时 |
| [矩阵](/algorithms/matrix/) | 高的 | 1 小时 |
| [链表](/algorithms/linked-list/) | 中间的 | 3 小时 |
| [队列](/algorithms/queue/) | 中间的 | 2 小时 |
| [堆栈](/algorithms/stack/) | 中间的 | 2 小时 |
#### 第三周[](#week-3 "Direct link to heading")
| 主题 | 优先 | 所需时间 |
| --- | --- | --- |
| [](/algorithms/tree/) | 高的 | 4 小时 |
| [图形](/algorithms/graph/) | 高的 | 4 小时 |
| [](/algorithms/heap/) | 中间的 | 3 小时 |
| 排序 | 中间的 | 3 小时 |
#### 第四周[](#week-4 "Direct link to heading")
| 主题 | 优先 | 所需时间 |
| --- | --- | --- |
| [间隔](/algorithms/interval/) | 中间的 | 2 小时 |
| [动态编程](/algorithms/dynamic-programming/) | 低的 | 4 小时 |
| [二进制](/algorithms/binary/) | 低的 | 2 小时 |
| [数学](/algorithms/math/) | 低的 | 1 小时 |
| [几何形状](/algorithms/geometry/) | 低的 | 1 小时 |
### 第 5 - 12 周:深度练习[](#week-5---12-in-depth-practice "Direct link to heading")
在这里,我列出了你应该做的 75 个问题,为你的编码面试做好充分准备。这个问题列表是从 [**Grind 75 工具**](https://www.techinterviewhandbook.org/grind75/) (由我搭建)中生成的,它根据你所剩的时间生成编码面试的推荐学习计划。更多的选项,如按难度过滤,主题,可选择的问题分组可以在那里找到。
* 如果你遵循了第 1 - 4 周的学习计划,你应该已经完成了这里的一些问题。随意跳过它们或者再做一遍。
* 如果你没有研究过动态编程问题或者觉得这些问题不相关,可以跳过它们。无论如何,许多动态规划问题都可以用递归/回溯来解决。
在你练习的早期,不要忘记应用[编码面试最佳实践](/coding-interview-cheatsheet/)中的行为和[编码面试技巧](/coding-interview-techniques/)中的方法!
我们推荐使用 [**Grind 75**](https://www.techinterviewhandbook.org/grind75/) 工具,它可以让你跟踪你的练习进度。
## 为你的自我介绍、最终问题和模拟编码面试留出时间[](#factor-time-for-your-self-introduction-final-questions-and-mock-coding-interviews "Direct link to heading")
除了学习和练习编码面试,你还应该准备你的自我介绍,最后的问题,并尝试模拟编码面试。
### 准备自我介绍和要问的最后问题[](#prepare-self-introduction-and-final-questions-to-ask "Direct link to heading")
我建议用大约 3 个小时来准备你的自我介绍,并准备一些最后要问的问题。你可以参考这个[自我介绍指南](/self-introduction/)[最终问题提问指南](/final-questions/),它们应该可以帮助你相当快速地完成这些步骤。
### 安排模拟编码面试[](#schedule-mock-coding-interviews "Direct link to heading")
当您的编码面试学习和实践计划完成了 60%时,您应该开始安排模拟编码面试。面试时间通常是由面试官提供的,所以你可以提前查看和预订。我个人用过并推荐的平台是[interview . io](https://iio.sh/r/DMCa)。在这里阅读更多关于[不同模拟编码面试平台的信息](/mock-interviews/)
</header>
\ No newline at end of file
# 编码面试备忘单:事前、事中和事后的最佳实践
> 原文:[https://www . techinterviewphandbook . org/coding-interview-cheat sheet/](https://www.techinterviewhandbook.org/coding-interview-cheatsheet/)
<header>
随着多年来编码面试的成熟,现在对候选人在编码面试中应该如何表现有了更坚定的期望。其中一些做法也有助于你通过展示你良好沟通和处理障碍的能力,向面试官展示“录用”信号。
从顶级候选人那里获得最佳实践,并基于[在编码面试中你将如何被评估](/coding-interview-rubrics/),我们在一份详尽的清单中总结了一些在编码面试中如何表现的顶级技巧——包括要避免的顶级错误。
甚至在你开始练习你的编码面试问题之前,你应该阅读并熟悉这个指南。伴随着这个指南的 LeetCode grinding 将会让你在早期就牢牢记住这些重要的编码面试行为。
## 做什么*之前*你的编码面试[T3】](#what-to-do-before-your-coding-interview "Direct link to heading")
* Dress Comfortably.
> Usually you don't need to wear beautiful clothes, just relax. T-shirts and jeans are acceptable in most places.
* ✅确保你已经阅读并准备好你的[自我介绍](/self-introduction/)[要问的最后问题](/final-questions/)
### 对于虚拟现场编码面试[](#for-virtual-onsite-coding-interviews "Direct link to heading")
<figure>![Summary of what to do before a virtual onsite coding interview](../Images/970ff011da29f41013a4ad88cfd9a3d3.png "Summary of what to do before a virtual onsite coding interview")
<figcaption>What to do before a virtual onsite coding interview</figcaption>
</figure>
* Prepare pen and paper.
> In case you need to record and imagine something. It is especially helpful for drawing trees/figures
* Use earphones or headphones and make sure you are in a quiet environment.
> Avoid using speakers, because if the echo is loud, communication will be difficult, and repetition by participants will only lead to the loss of valuable time.
* ✅检查一下你的网络连接是否正常。
* ✅检查你的网络摄像头和音频工作正常。
* Familiarize and set up shortcuts in the coding environment (code rpad/code pen).
> Set the shortcut keys of the editor, turn on auto-completion, tab spacing, etc. If you know shortcuts and make good use of them, the interviewer will be impressed with you
* Turn off the web cam if possible.
> Most remote interviews don't need video chat, and having video chat on will only distract attention and take up network bandwidth.
### 进行电话屏幕编码面试[](#for-phone-screen-coding-interviews "Direct link to heading")
<figure>![Summary of what to do before a phone screen coding interview](../Images/b6b2a2b790fa60931c23584e5c2e40bc.png "Summary of what to do before a phone screen coding interview")
<figcaption>What to do before a phone screen coding interview</figcaption>
</figure>
* Use earphones and put the phone on the table.
> Avoid holding the phone with one hand and typing with the other hand
* ✅请求使用 Zoom/Google Meet/Hangouts 或 Skype 代替电话。
> 更容易发送链接或文本. .
>
> T3】
### 对于现场白板编码面试[](#for-onsite-whiteboarding-coding-interviews "Direct link to heading")
* Learn about whiteboard space management.
> Leave space between lines of code in case you need to insert lines between existing codes.
## 在你的编码面试 [](#what-to-do-during-your-coding-interview "Direct link to heading") 期间做什么
<figure>*![Summary of what to do during a coding interview](../Images/bacaa6ccda75ea0c9e4d21ca463e587e.png "Summary of what to do during a coding interview")
<figcaption>What to do during a coding interview</figcaption>* </figure>
### *1.在面试开始时做好自我介绍[](#1-make-a-good-self-introduction-at-the-start-of-the-interview "Direct link to heading")*
* *Introduce yourself in a few sentences under a minute or 2\.
> How to introduce yourself for software engineers according to our guide*
* *✅ Sound enthusiastic!
> Smile and talk, and you will naturally sound more attractive.*
* *❌,不要在自我介绍上花太多时间,因为你剩下的编码时间会更少。*
### *2.收到问题后,进行澄清[](#2-upon-receiving-the-question-make-clarifications "Direct link to heading")*
*不要马上开始编码。编码问题往往含糊不清、不够具体,目的是让面试官衡量求职者对细节和细心的关注程度。至少问 2-3 个澄清性问题。*
* *✅复述并重复面试官的问题。
> 确保你完全明白他们在问什么. .
>
> T3】*
* *✅阐明假设(参考[算法备忘单](/algorithms/study-cheatsheet/)了解常见假设)
* > The tree graph is probably a graph that allows circulation, and a simple recursive solution won't work. Clarify whether a given diagram is a tree or a graph.
* > Can you modify the original array/graph/data structure in any way?
* > How is the input stored?
* > If you were given a word dictionary, would it be a list of strings or a Trie?
* > Is the input array sorted? (for example, for deciding between binary/linear searches)*
* *✅阐明输入值范围。
> 投入:多大,范围是什么?
>
> T3】*
* *Clarify input value format
> values: negative? Floating point? Empty? Null? Repeat? Oversized?*
* *Work through a simplified example to assure you under the question.
> For example, you are asked to write a palindrome checker, and before coding, come up with simple test cases, such as "kayak" = > true, "mouse" = > false, and then check with the interviewer whether these examples meet their expectations*
* *❌不要马上开始编程,或者在面试官给你开绿灯之前就开始。*
### *3.与面试官一起制定并优化你的方法[](#3-work-out-and-optimize-your-approach-with-the-interviewer "Direct link to heading")*
*接下来你能做的最糟糕的事情就是直接跳到编码——面试官希望有一些时间来进行双向讨论,讨论解决问题的正确方法,包括对时间和空间复杂性的分析。*
*根据问题的复杂程度,讨论时间从几分钟到 5-10 分钟不等。这也给面试官一个机会给你提示,引导你找到一个可以接受的解决方案。*
* *✅:如果你在方法或优化上卡住了,用[这种结构化的方法](/coding-interview-techniques/)来唤起你的记忆/找到一个好的方法*
* *✅ Explain a few approaches that you could take at a high level (don't go too much into implementation details) . discuss the trade offers of each approach with your interviewer as if the interviewer was your coworker and you are all collaborating on a problem.
> For algorithm problems, space/time is a common trade-off. Let's take the famous [2 and](https://leetcode.com/problems/two-sum/) problems as examples. There are two common solutions-(1) using nested for loops. This is O (n <sup>2</sup> ) in terms of time complexity and O(1) in terms of space. (2) In one pass of the array, you can hash a value to the index in the hash table. For subsequent values, look up the hash table to see if you can find an existing value that can be added to the target value. This method is O(N) in time and space. Discuss these two solutions, propose a compromise, and summarize which solution is better (usually the one with lower time complexity)*
* *And explain the time and space complexity of your proposed approach (es).
> Mention the great complexity of time and explain the reasons (for example, O (n <sup>2</sup> means time because there are nested for loops; O(n) for space, because an extra array is created). Use [algorithm optimization technology](/coding-interview-techniques/#how-to-optimize-your-approach-or-solution) to master all the time and space complexity.*
* *✅同意最理想的方法,并对其进行优化。识别重复/重复/重叠的计算,并通过缓存减少它们。请参阅第[页优化您的解决方案](/coding-interview-techniques/#how-to-optimize-your-approach-or-solution)。*
* *❌不要马上开始编程,或者在面试官给你开绿灯之前就开始。*
* *❌不会忽视任何一条给定的信息。*
* *❌似乎对你的方法和分析没有把握。*
### *4.一边讨论一边写出你的解决方案[](#4-code-out-your-solution-while-talking-through-it "Direct link to heading")*
* *✅:只有在你解释了你的方法并且面试官给你开了绿灯之后,你才可以开始编程。*
* *✅解释你在编码/写作时试图达到的目标。比较相关的不同编码方法。
> 这样做,证明你掌握了你选择的编程语言. .
>
> T3】*
* *Code/write at a rational speed so you can talk through it-but not too slow.
> You want to type slowly enough to explain the code, but not too slow, because you may not have time to answer all the questions*
* *✅写实际的可编译的工作代码,而不是伪代码。*
* *Write clean, straight forward and neat code with as few syntax errors/bugs as possible.
> Always choose a clean and simple implementation instead of a complicated and chaotic one. Ensure that neat coding style and good coding practice are adopted according to language examples and structures. Grammatical errors and bugs should be avoided as much as possible.*
* *Use variable names that explain your code.
> Good variable names are important because you need to explain your code to the interviewer. It is best to use a long variable name that can explain the problem. Suppose you need to find multiples of 3 in a set of numbers. Name the result as array `multiplesOfThree` instead of array/number.*
* *✅请求允许使用琐碎函数,而不必实现它们。
> 例如`reduce`、`filter`、`min`、`max`应该都可以使用*
* *Write in a modular fashion, going from higher-level functions and breaking them down into smaller helper functions.
> Suppose you are asked to make a car. You can just write a few advanced functions: `gatherMaterials()`, `assemble()`. Then decompose `assemble()` into smaller functions, `makeEngine()`, `polishWheels()`, `constructCarFrame()`. You can even ask the interviewer if you can not write some trivial helper functions.*
* *✅ If you are cutting corners in your code, State that out loud to your interviewer and say what you would do in a non-interview setting (no time constraints).
> For example, "In a non-interview setting, I will write a regular expression to parse this string instead of using `split()` which may not cover some marginal situations."*
* *✅ 【现场/白板】练习白板空间管理*
* *❌:当你的面试官在说话的时候,不要打断他们。通常,如果他们说话,他们是在试图给你暗示或引导你到正确的方向。*
* *❌不花太多时间写评论。*
* *❌不要重复自己*
* *❌不使用不好的变量名。
* 不要使用极其冗长或单字符的变量名,(除非它们很常见,如`i`、`n`)变量名*
* *❌不会在没有检查的情况下复制和粘贴代码(例如,一些变量在粘贴后可能需要重命名)。*
### *5.编码后,检查你的代码并添加测试用例[](#5-after-coding-check-your-code-and-add-test-cases "Direct link to heading")*
*一旦你完成了编码,不要宣布你完成了。面试官希望你开始扫描错误并添加测试用例来改进你的代码。*
* *Scan through your code for mistakes-such as off-by-one errors.
> Read through your code with a pair of fresh eyes-just like the first time you saw a piece of code written by someone else-and discuss the process of finding your mistakes*
* *Brain edge cases with the interviewer and add additional test cases. (refer to [algorithms cheat cases](/algorithms/study-cheatsheet/) for common corner cases)
> The given test cases are usually designed simply. Brainstorm possible edge situations, such as large size input, empty set, single item set, negative number.*
* *✅用那些测试用例一步一步地检查你的代码。*
* *✅寻找可以重构的地方。*
* *Reiterate the time and space complexity of your code.
> This allows you to remind yourself of problems in your code that may deviate from the original time and space complexity.*
* *✅解释了权衡,以及如果给更多的时间,代码/方法可以如何改进。*
* *❌不要马上宣布你完成了编码。先做到以上!*
* *❌不与面试官争论。他们可能是错的,但这是不太可能的,因为他们对这个问题很熟悉。*
### *6.面试结束时,留下好印象[](#6-at-the-end-of-the-interview-leave-a-good-impression "Direct link to heading")*
* *✅会问一些针对公司的好的最后问题。
> 阅读提示和[要问](/final-questions/)的示例最终问题. .
>
> T5】*
* *✅感谢面试官*
* *❌不会不问任何问题就结束面试。*
## *后做什么*你的编码面试[T3】](#what-to-do-after-your-coding-interview "Direct link to heading")**
<figure>*![Summary of what to do after a coding interview](../Images/c154f85a33c0eba4350e662612b470d6.png "Summary of what to do after a coding interview")
<figcaption>What to do after a coding interview</figcaption>* </figure>
* *✅把面试的问题和答案记录下来,因为这些对将来参考有用。*
* *✅给你的面试官发一封跟进邮件或 Linkedin 邀请,感谢他们抽出时间给你面试的机会。
> 我自己作为一个面试官,这些都能给我留下持久的印象. .
>
> T3】*
</header>
\ No newline at end of file
# 处理和解决编码面试问题的顶级技巧
> 原文:[https://www . techinterviewphandbook . org/coding-interview-techniques/](https://www.techinterviewhandbook.org/coding-interview-techniques/)
<header>
大多数候选人在编码面试中最大的恐惧是:如果我在问题上卡住了,不知道怎么做怎么办?幸运的是,有结构化的方法来处理编码面试问题,这将增加你解决这些问题的机会。从如何找到解决方案或方法,到优化时间和空间复杂性,这里有一些顶级技巧和最佳实践,将帮助您解决编码面试问题。
## 如何找到编码面试问题的解决方案[](#how-to-find-solutions-to-coding-interview-problems "Direct link to heading")
当给出一个编码面试问题时,候选人应该从提出澄清性问题开始,并与他们的面试官讨论一些可能的方法。然而,这是大多数考生容易被卡住的地方。幸运的是,有一些方法可以以结构化的方式做到这一点。
请注意,并非所有的技术都适用于每个编码面试问题,您也可以在一个问题上使用多种技术!当你在实践中应用这些技术时,你会发展出直觉,知道哪种技术对手头的问题有用。
### 1.把问题画出来 [](#1-visualize-the-problem-by-drawing-it-out "Direct link to heading") 形象化
有没有想过为什么编码面试传统上在白板上进行,而解释编码问题答案的视频往往使用图表?白板使绘制图表变得容易,这有助于解决问题!编码的很大一部分是理解程序的内部状态是如何变化的,而图是表示内部数据结构状态的非常有用的工具。如果你很难理解解决方案是如何获得的,想出问题的可视化表示,如果必要的话,每一步的内部状态。
如果输入涉及树、图、矩阵、链表,这种技术特别有用。
#### 例[](#example "Direct link to heading")
你如何[以螺旋顺序](https://leetcode.com/problems/spiral-matrix/)返回一个矩阵的所有元素?画出矩阵和迭代器在每个方向上需要采取的步骤,将极大地帮助你看清模式。
### 2.想想你会如何用手 [](#2-think-about-how-you-would-solve-the-problem-by-hand "Direct link to heading") 解决这个问题
手工解决问题就是不用写任何代码就能解决问题,就像非程序员会做的那样。当你试图理解给你的例子时,这已经很自然的发生了。
有些人没有意识到的是,有时一个有效的解决方案只是手工方法的代码版本。如果你能提出一套适用于每个例子的具体规则,你就能为它编写代码。虽然这样做可能不会得到最有效的解决方案,但这是一个给你加分的开始。
#### 例[](#example-1 "Direct link to heading")
你如何不用写任何代码来验证一棵树是否是一个有效的二叉查找树?首先检查左子树是否只包含小于根的值,然后检查右子树是否只包含大于根的值,然后对每个节点重复上述操作。这个过程似乎是可行的。现在你只需要把这个过程变成代码。
### 3.想出更多的例子[](#3-come-up-with-more-examples "Direct link to heading")
想出更多的例子是你可以做的有用的事情,不管你是否卡住了。它帮助你加强对问题的理解,防止你过早地进入编码,帮助你识别一个可以推广到任何输入的模式,这就是解决方案!最后,在最后验证您的解决方案时,可以使用多个示例作为测试用例。
### 4.将问题分解成更小的独立部分[](#4-break-the-question-down-into-smaller-independent-parts "Direct link to heading")
如果问题很大,从一个高级函数开始,把它分解成更小的组成函数,分别解决每一个。这可以防止你被同时做每件事的细节弄得不知所措,并保持你的思维有条理。
这样做也让面试官清楚地知道你有一个方法,即使你没有完成所有小功能的编码。
#### 例[](#example-2 "Direct link to heading")
[分组字谜](https://leetcode.com/problems/group-anagrams/)问题可以分解成两个部分——散列一个字符串,将字符串分组在一起。每个部分都可以用独立的实现细节单独解决。您可以从以下代码开始:
```
def group_anagrams(strings): def hash(string): # Fill in later pass def group_strings(strings_hashes): # Fill in later pass strings_hashes = [(string, hash(string)) for string in strings] return group_strings(strings_hashes)
```
并继续填写每个功能的实现。但是,请注意,有时最有效的解决方案需要您打破一些抽象,在一次输入中执行多个操作。如果你的面试官要求你根据你精心抽象的解决方案进行优化,这是一条可能的前进道路。
### 5.在问题 [](#5-apply-common-data-structures-and-algorithms-at-the-problem "Direct link to heading") 中应用常用的数据结构和算法
与现实世界中的软件工程不同,在现实世界中,问题通常是开放式的,可能没有明确的解决方案,编码面试问题本质上往往较小,并且被设计为在面试期间是可解决的。你也可以期待解决问题所需的知识并不在这个世界上,他们会在大学期间被教授。幸运的是,通用数据结构和算法的数量是有限的,根据我的经验,一种可行的方法是尝试遍历所有的通用数据结构,并将它们应用到问题中。
以下是需要记住和尝试的数据结构,按照它们在编码面试问题中出现的频率排列:
* **哈希映射**:有助于提高查找效率。这是面试中最常用的数据结构,你肯定会用到它。
* **图**:如果数据以实体间关联的形式呈现给你,你或许可以将问题建模为图,并使用一些常见的图算法来解决问题。
* **堆栈和队列**:如果你需要解析一个具有嵌套属性的字符串(比如一个数学方程),你几乎肯定需要使用堆栈。
* **堆**:问题涉及到基于某种优先级的调度/排序。也有助于找到一个集合中的最大 K/最小 K/中值元素。
* **Tree/Trie** :你是否需要以一种空间高效的方式存储字符串,并且非常快速地寻找字符串(或者至少是部分字符串)的存在?
**套路**
* 整理
* 二分搜索法:如果输入数组是有序的,并且你需要比 O(n)搜索更快的速度,这很有用
* 推拉窗
* 两点
* 联合查找
* BFS/DFS
* 从后面穿过
* 拓扑排序
在将来,我们会添加一些技巧,告诉你如何根据问题更好地识别最相关的数据结构和例程。
## 如何优化你的方法或解决方案[](#how-to-optimize-your-approach-or-solution "Direct link to heading")
在你想出编码面试问题的初步解决方案后,你的面试官很可能会问你“我们能做得更好吗”来提示你优化解决方案。以下技术可帮助您进一步优化解决方案的时间和空间复杂性:
### 如何优化时间复杂度[](#how-to-optimize-time-complexity "Direct link to heading")
#### 1.确定解决方案的最佳理论时间复杂度[](#1-identify-the-best-theoretical-time-complexity-of-the-solution "Direct link to heading")
一个解决方案的最佳理论时间复杂度(BTTC)是你知道你无法超越的时间复杂度。
一些简化的例子:
* 寻找数组中数字之和的 BTTC 是 O(n ),因为你必须至少查看数组中的每个值一次
* 找到字谜组的数量[的 BTTC 是 O(nk ),其中 n 是单词的数量,k 是一个单词中的最大字母数量,因为你必须至少看每个单词一次,并且至少看每个单词中的每个字符一次](https://leetcode.com/problems/group-anagrams/)
* 寻找矩阵中岛的数量的 BTTC 是 O(nm ),其中 n 是行数,m 是列数,因为你必须至少查看矩阵中的每个单元一次
为什么了解 BTTC 很重要?这样你就不会掉进兔子洞,去寻找比 BTTC 更快的解决方案。最快的实际解决方案只能和 BTTC 一样快,而不能比 BTTC 更快。BTTC 在实践中不一定是可实现的(因此是理论上的),它只是意味着你永远找不到比它更快的真正解决方案。如果您的初始解决方案比 BTTC 慢,可能有机会改进,以便您可以达到 BTTC(但并不总是如此)。向你的面试官提及 BTTC 不会有什么坏处,这将被视为一个积极的信号,同时也提醒你自己不应该试图想出比 BTTC 更快的东西。
有些人可能认为 BTTC 只是数据结构中元素的总数,因为您需要遍历每个元素一次。这是**不总是真的**。最著名的例子是在一个有序的数字数组中寻找一个数字。排序属性改变了很多事情:
* 因为可以使用二分搜索法,所以求一个数的速度是 O(log(n))。
* 寻找最大的数字应该是 O(1 ),因为它是数组中的最后一个值。
这就是为什么关注这个问题的每个细节是很重要的。注意不要因为不注意问题细节而判断出错误的 BTTC!
确定了正确的 BTTC 后,您现在知道最优解的时间复杂度位于初始解和 BTTC 之间,并且可以朝着最优解前进。如果你的解决方案已经有了 BTTC,而面试官要求你进一步优化,通常他们会注意两件事:
* 做更少的工作。你的解决方案可以是 O(n ),但是要对数组进行两次遍历,面试官正在寻找使用单次遍历的解决方案。
* 使用较少的空间。请参考下面关于优化空间复杂性的部分。
#### 2.识别重叠和重复计算[](#2-identify-overlapping-and-repeated-computation "Direct link to heading")
一个幼稚/暴力的解决方案经常一遍又一遍地执行相同的操作。当代码正在做一个以前做过的代价很高的操作时,花一点时间后退一步,考虑一下是否可以重用以前计算的结果。动态编程(DP)是最明显的问题类型,你可以完全利用过去的计算。有一些非 DP 问题也可以利用这种技术,尽管不那么简单,可能需要预处理步骤。
##### 例[](#example-3 "Direct link to heading")
除自身之外的阵列的[乘积](https://leetcode.com/problems/product-of-array-except-self/)问题是包含重叠/重复工作的问题的一个很好的例子。要得到一个指数的值,你需要将所有其他位置的值相乘。对数组中的每个值都这样做将花费 O(n <sup>2</sup> 时间。但是,请注意:
* `result[n]` : `Product(nums[0] … nums[n-1]) * Product(nums[n + 1] … nums[N - 1])`
* `result[n + 1]` : `Product(nums[0] … nums[n]) * Product(num[n + 2] … nums[N - 1])`
在计算`result[n]``result[n + 1]`之间有大量重复的工作!这是一个重用在计算`result[n]`时进行的早期计算来计算`result[n + 1]`的机会。事实上,我们可以利用前缀数组来帮助我们以更多的空间为代价在 O(n)时间内得到最终的解。
#### 3.尝试不同的数据结构[](#3-try-different-data-structures "Direct link to heading")
数据结构的选择是编写面试代码的关键。它可以帮助你找到问题的解决方案,也可以帮助你优化现有的解决方案。有时候,再一次遍历你所知道的数据结构是值得的。
查找时间是否降低了算法的速度?一般来说,在哈希表的帮助下,大多数查找操作应该是 O(1)。如果解决方案中的查找操作是解决方案时间复杂性的瓶颈,通常情况下,您可以使用哈希表来优化查找。
##### 例[](#example-4 "Direct link to heading")
通过计算每个点的距离,对它们进行排序,然后取 K 个最小值,可以以一种简单的方式解决 [K 个离原点最近的点](https://leetcode.com/problems/k-closest-points-to-origin/)的问题。由于排序,这需要 O(nlog(n))时间。然而,通过使用堆数据结构,时间复杂度可以降低到 O(nlog(k)),因为当堆的大小被限制在 K 个元素时,从堆添加/移除仅花费 O(log(k))时间。改变数据结构对算法的效率有很大的影响!
#### 4.识别多余的工作[](#4-identify-redundant-work "Direct link to heading")
这里有几个做冗余工作的代码示例。尽管犯这些错误可能不会改变代码的整体时间复杂度,但是您的编码能力也会受到评估,因此编写尽可能高效的代码非常重要。
##### 不必要的检查条件[](#dont-check-conditions-unnecessarily "Direct link to heading")
这些是 Python 示例,其中第二次检查是多余的。
* `if not arr and len(arr) == 0` -第一次检查已经确保数组是空的,所以不需要第二次检查。
* `x < 5 and x < 10` -第二次检查是第一次检查的子条件。
##### 注意检查的顺序[](#mind-the-order-of-checks "Direct link to heading")
* 此检查有两个操作,持续时间不同。只要其中一个操作评估为`true`,条件将评估为`true`。大多数计算机从左到右执行操作,因此将`fast()`放在左边更有效。
* `if likely() and unlikely()`——这个例子使用了和上面类似的论点。如果我们先执行`unlikely()`并且它是`false`,我们就不必执行`likely()`
##### 不要调用不必要的方法[](#dont-invoke-methods-unnecessarily "Direct link to heading")
如果您必须在函数中多次引用某个属性,并且该属性必须从函数调用中派生,那么如果该值在函数的整个生命周期中没有变化,请将结果作为变量进行缓存。输入数组的长度是最常见的例子。大多数时候,输入数组的长度不会改变,在开始时声明一个名为`length = len(array)`的变量,并在函数中使用`length`,而不是每次需要时都调用`len(array)`
##### 提前终止[](#early-termination "Direct link to heading")
提前终止。在你已经有答案后停止,立即返回答案。这里有一个利用提前终止的例子。考虑这个基本问题“确定一个字符串数组是否包含一个不区分大小写的字符串”。它的代码是:
```
def contains_string(search_term, strings): result = False for string in strings: if string.lower() == search_term.lower(): result = True return result
```
这个代码有用吗?绝对的。这段代码尽可能高效了吗?没有。我们只需要知道搜索项是否存在于字符串数组中。一旦我们知道这个值存在,我们就可以停止迭代。
```
def contains_string(search_term, strings): for string in strings: if string.lower() == search_term.lower(): return True # Stop comparing the rest of the array/list because the result won't change. return False
```
大多数人已经知道这一点,并且已经在面试之外这样做了。然而,在紧张的面试环境中,人们往往会忘记最明显的事情。尽可能从循环中尽早终止。
##### 最小化循环内的工作[](#minimize-work-inside-loops "Direct link to heading")
让我们进一步改进上面的例子来解决问题“确定一个字符串数组是否包含一个不区分大小写的字符串”。
```
def contains_string(search_term, strings): for string in strings: if string.lower() == search_term.lower(): return True return False
```
注意,for 循环的每个循环都要调用一次`search_term.lower()`!这是一种浪费,因为`search_term`在函数的整个生命周期中不会改变。
```
def contains_string(search_term, strings): search_term_lowercase = search_term.lower() for string in strings: if string.lower() == search_term_lowercase: return True return False
```
尽量减少循环内的工作,如果没有变化,不要重复已经做过的工作。
##### 偷懒[](#be-lazy "Direct link to heading")
惰性求值是一种求值策略,它将表达式的求值延迟到需要它的值时。让我们使用与上面相同的例子。我们可以在技术上稍微改进一下:
```
def contains_string(search_term, strings): if len(strings) == 0: return False # Don't have to change the search term to lower case if there are no strings at all. search_term_lowercase = search_term.lower() for string in strings: if string.lower() == search_term_lowercase: return True return False
```
这被认为是一种微优化,大多数时候,`strings`不会为空,但是我用它来说明这个例子,如果不需要某些计算,你可以不做。这也适用于代码中需要的对象的初始化(通常是哈希表)。如果输入是空的,没有必要初始化任何变量!
### 如何优化空间复杂度[](#how-to-optimize-space-complexity "Direct link to heading")
很多时候,时间复杂度比空间复杂度更重要。但是,当你已经达到最佳时间复杂度时,面试官可能会要求你优化你的解决方案所使用的空间(如果它使用了额外的空间)。这里有一些技巧可以用来提高代码的空间复杂度。
#### 1.就地更改数据/覆盖输入数据[](#1-changing-data-in-placeoverwriting-input-data "Direct link to heading")
如果您的解决方案包含创建新数据结构以进行中间处理/缓存的代码,则内存空间正在被分配,这有时会被视为负面的。解决这个问题的一个技巧是覆盖原始输入数组中的值,这样就不会在代码中分配任何新的空间。但是,如果您需要在代码的后续部分使用输入数据,请注意不要以不可逆的方式破坏它。
一个可行的方法(但是你不应该在编码面试之外使用)是改变原始数组,并把它作为一个散列表来存储中间数据。参考下面的例子。
请注意,在软件工程中,改变输入数据通常是不可取的,并且会使您的代码更难阅读和维护,因此就地更改数据通常只应在编码面试中进行。
#### 例[](#example-5 "Direct link to heading")
荷兰国旗问题可以用 O(n)时间和 O(n)空间很容易地解决,方法是创建一个新数组,并以排序的方式用相应的值填充它。作为一个额外的挑战和空间优化,面试官通常会要求 O(n)时间和 O(1)空间的解决方案,其中包括就地排序输入数组。
使用原始数组作为哈希表的一个例子是[第一个缺失的正](https://leetcode.com/problems/first-missing-positive)问题。在第一次 for 循环之后,数组中的所有值都是正的,您可以通过在对应于某个数字的索引处对该值求负来指示该数字的存在。为了指示 4 存在,求反`nums[4]`
#### 2.改变数据结构[](#2-change-a-data-structure "Direct link to heading")
又是数据结构!?是的,又是数据结构!数据结构是编写面试代码的基础,对它的掌握决定了你面试的成败。对于这个问题,你是否使用了最好的数据结构?
#### 例[](#example-6 "Direct link to heading")
给你一个字符串列表,你想知道有多少个字符串以某个前缀开头。存储字符串的有效方法是什么,这样你就可以快速计算出你的答案?一个 [Trie](https://leetcode.com/problems/implement-trie-prefix-tree/) 是一个树状的数据结构,对于存储字符串非常有效,并且允许你快速计算有多少个字符串以前缀开头。
## 下一步[](#next-steps "Direct link to heading")
如果你还没有,我建议你看看我的[免费结构化编码面试指南](/software-engineering-interview-guide/),它包含了一步一步的指导,例如:
* [如何为你的编码面试准备制定一个有效的计划](/coding-interview-study-plan/) -根据你剩下的时间,包括要研究的主题和问题的优先级
* 编码面试最佳实践备忘单 -包括如何在编码面试中表现出招聘信号
* [算法备忘单](/algorithms/study-cheatsheet/)——包括必须的——记住你应该对每个数据结构进行内部化
</header>
\ No newline at end of file
# 软件工程师最佳模拟编码面试平台
> 原文:[https://www.techinterviewhandbook.org/mock-interviews/](https://www.techinterviewhandbook.org/mock-interviews/)
<header>
面试是一项你可以越来越擅长的技能。上面提到的步骤可以一遍又一遍地练习,直到你完全内化它们,并且遵循这些步骤成为你的第二天性。练习的一个好方法是找一个朋友做搭档,你们俩可以轮流面试对方。
## [interview . io](https://iio.sh/r/DMCa)[T3】](#interviewingio "Direct link to heading")
练习模拟编码面试的一个很好的资源是[interview . io](https://iio.sh/r/DMCa)[intervaling . io](https://iio.sh/r/DMCa)提供与谷歌和脸书工程师的匿名实践技术面试,这可以带来真正的工作和实习机会。由于在采访过程中匿名,包容性采访过程是去偏见和低风险的。在采访结束时,采访者和被采访者可以互相提供反馈,以达到改进的目的。在模拟面试中表现出色将会打开求职页面,让求职者可以预约优步、Lyft、Quora、Asana 等顶级公司的面试(也可以匿名)。您还可以针对更具体的职位(如移动、前端、工程管理)预约模拟面试。对于那些完全不熟悉技术面试的人,你甚至可以观看[录制的面试](https://interviewing.io/recordings),看看电话面试是怎样的。点击阅读更多关于它们的信息[](https://techcrunch.com/2017/09/27/interviewing-io-hopes-to-close-the-engineer-diversity-gap-with-anonymous-interviews/)
我作为面试官和被面试者都使用过[interview . io](https://iio.sh/r/DMCa)并发现这种体验真的很棒![Aline Lerner](https://twitter.com/alinelernerLLC),[intervaling . io](https://iio.sh/r/DMCa)的首席执行官兼联合创始人和她的团队热衷于革新技术面试流程,帮助应聘者提高面试技巧。她还在[intervaling . io 博客](http://blog.interviewing.io/)上发表了许多与技术面试相关的文章。
## 普拉普[t1](#pramp "Direct link to heading")
另一个可以让你练习编码面试的平台是 [Pramp](https://pramp.com) 。Pramp 采用不同的方法,将潜在求职者与经验丰富的技术面试官匹配。Pramp 将你与另一位同样是求职者的同伴配对,你们两人轮流扮演面试官和被面试者的角色。Pramp 还为您准备了问题,以及建议的解决方案和提示来指导受访者。
就我个人而言,我不太喜欢 Pramp 的方法,因为如果我要采访某人,我宁愿选择一个我熟悉的问题。此外,该平台的许多用户没有担任面试官的经历,这可能会导致糟糕的面试体验。曾经有一次,我的同伴,作为面试官,对问题没有正确的理解,并试图引导我走上解决问题的错误道路。然而,这更多的是候选人的问题,而不是平台的问题。
</header>
\ No newline at end of file
# 顶尖科技公司如何在编码面试中评估候选人
> 原文:[https://www . techinterviewphandbook . org/coding-interview-rubrics/](https://www.techinterviewhandbook.org/coding-interview-rubrics/)
<header>
想知道像谷歌、亚马逊、苹果和网飞这样的顶级科技公司是如何评估编码面试的吗?
在顶级科技公司中,编码面试评估标准实际上并没有很大的不同。虽然标题中使用的确切术语可能不同,但评估的维度大致相似。
在本指南中,我将详细介绍大型科技公司的通用编码面试评估流程。我还附上了一个[示例标题](/coding-interview-rubrics/),你可以在自己练习或与同伴练习时使用。
如果你还没有这样做,请参考我的[编码面试最佳实践备忘单](/coding-interview-cheatsheet/),它基本上综合了候选人应该做些什么来满足编码面试中的评估标准。
## 候选人评分方法[](#candidate-scoring-methodology "Direct link to heading")
一般来说,在 FAANG / MANGA 公司中,编码面试评估标准可以大致分为 4 个维度:
1. 交流——候选人在编码的时候有没有做出澄清,交流他们的方法和解释?
2. 解决问题——候选人是否表明他们理解问题,并能够提出一个合理的方法,进行权衡分析并优化他们的方法?
3. 技术能力-实施的速度和准确性如何?有语法错误吗?
4. 测试——代码是否针对常见情况和极端情况进行了测试?他们有没有自我修正 bug?
在编码面试中有两种候选人评分的一般方法:
1. 为每个维度提供一个分数(如 1-4 分),并将它们相加得到一个总分
2. 根据各方面的总体表现给出总分(如 1-4 分)
无论使用何种方法,评分等级通常为:
* 强势雇佣
* 雇用
* 不雇佣
* 强烈不雇佣
当面试官觉得候选人需要更多的评估时,一些公司可能会犹豫不决。
## 你的分数如何影响结果?[](#how-does-your-score-impact-the-result "Direct link to heading")
无论采用何种评分方法,最终得分都是基于评估标准的整体表现(而不是纯粹通过某个数学截止值)。
对于每一轮电话筛选,通常只有一个面试官,因此,如果他们不给你相当于“优先录用”或以上的“通过”,你就不会进行整个面试循环。如果这一轮没有获得明确的信号,您可能会被要求进行后续的电话筛查。
大多数顶级科技公司都允许应聘者在做出最终决定之前,在整个面试过程中经历每一轮面试。如果候选人在不同轮次中收到不同的结果(有些“通过”,有些“失败”),面试官将根据你展示的信号召集讨论。这就是为什么你在整个面试过程中的表现很重要。
在某些情况下,如后续电话筛选轮次,候选人可能会被邀请参加额外的评估轮次,如果:
* 评估中遗漏了一些方面,例如,两轮编码面试者给出了非常相似的问题
* 候选人在特定区域显示混合信号,需要额外的回合以获得更可靠的信号
一般来说,所有面试官都可以看到你每一轮的分数和反馈。有时,面试官甚至可以看到你过去在同一家公司面试的反馈,以避免再次问同样的问题。公司希望看到你比过去有所成长。所以,如果你过去被一家公司拒绝了,反思一下可能的原因,并在你再次面试这家公司时解决这些问题。
## 每个评估标准的详细说明[](#detailed-explanation-of-each-evaluated-criteria "Direct link to heading")
### 1.通信[](#1-communication "Direct link to heading")
基本通信信号:
* 询问适当的澄清问题
* 传达方法、原理和权衡
* 不断沟通,即使是在编码的时候
* 组织良好、简洁、清晰的沟通
| 得分 | 综合评价 |
| --- | --- |
| 强势雇佣 | 在整个面试过程中,就思维过程而言,沟通是彻底的、组织良好的、简洁的和清晰的——包括他们如何理解问题、他们的方法、取舍。面试官在跟踪和理解求职者的思维过程方面没有任何挑战。 |
| 倾斜雇佣 | 在整个面试过程中,沟通是充分的、清晰的、有条理的。然而,面试官不得不问一些后续问题来了解应聘者的某些方面,比如他们的方法或思维过程。 |
| 倾向于不雇佣 | 在整个面试过程中,沟通不畅(以下一项或多项):(1)不充分(例如,没有解释就开始编码),(2)组织混乱或不清楚
面试官很难跟上应聘者的思维过程。 |
| 强烈不雇佣 | 无法清晰地交流,甚至在被面试官询问时也保持沉默。面试官很难理解应聘者的思维过程。 |
### 2.解题[](#2-problem-solving "Direct link to heading")
基本问题解决信号:
* 通过提出好的澄清性问题,迅速理解问题
* 系统而有逻辑地研究这个问题
* 能够提出一个优化的解决方案
* 精确确定时间和空间复杂度
* 不需要面试官的任何重要暗示
高级问题解决信号:
* 想出了多种解决方案
* 清楚而正确地解释了每种解决方案的利弊,总结出哪种解决方案最适合当前场景
* 有时间讨论后续问题/延期
| 得分 | 综合评价 |
| --- | --- |
| 强势雇佣 | 完成所有基本的问题解决信号没有问题,并且有足够的时间完成最高级的问题解决信号。 |
| 倾斜雇佣 | 设法获得所有基本问题解决信号,但没有足够的时间获得高级问题解决信号。 |
| 倾向于不雇佣 | 只显示了一些基本的解决问题的信号,未能实现其余的。 |
| 强烈不雇佣 | 无法解决问题,或者在没有对他们的思维过程进行解释的情况下解决了问题。方法混乱且不正确。 |
### 3.技术能力[](#3-technical-competency "Direct link to heading")
基本技术能力信号:
* 将讨论的解决方案转化为工作代码,并尽量减少或消除错误
* 干净直接的实现,没有语法错误和不必要的代码,良好的编码实践,例如 DRY(不要重复自己),使用适当的抽象
* 整洁的编码风格(适当的缩进、间距、变量命名等)
高级技术能力信号:
* 比较几种编码方法
* 展示了对语言结构和范例的丰富知识
| 得分 | 综合评价 |
| --- | --- |
| 强势雇佣 | 轻松展示基本和高级能力信号。 |
| 倾斜雇佣 | 仅展示了基本的技术能力信号,在将方法转化为代码方面存在一些困难。语言范式的次优用法。 |
| 倾向于不雇佣 | 努力用代码写出一个可行的解决方案。多种语法错误和语言范例的错误使用。 |
| 强烈不雇佣 | 无法用代码产生一个可行的解决方案。主要的语法错误和非常糟糕的语言范例的使用。 |
### 4.测试[](#4-testing "Direct link to heading")
测试信号
* 想出了更多的典型案例,并针对这些案例测试了他们的代码
* 发现并处理角落案例
* 识别并自我纠正代码中的错误
* 能够以系统的方式验证代码的正确性(例如,像调试器一样运行并单步执行每一行,在每一步更新程序的状态)
| 得分 | 综合评价 |
| --- | --- |
| 强势雇佣 | 轻松演示测试信号。 |
| 倾斜雇佣 | 在演示测试信号时遇到一些困难,比如不能识别所有相关的极限情况。 |
| 倾向于不雇佣 | 进行测试,但不处理边角案例。无法识别或纠正代码中的错误。 |
| 强烈不雇佣 | 甚至没有针对典型情况测试代码。没有发现代码中明显的错误,并宣布他们已经完成 |
<figure>![Coding interview evaluation rubric for software engineers](../Images/a854d421166b353ea0d7430fb2f7bd5f.png "Coding interview evaluation rubric for software engineers")
<figcaption>Sample coding interview evaluation rubric, for practice</figcaption>
</figure>
</header>
\ No newline at end of file
# 系统设计面试准备
\ No newline at end of file
# 软件工程师系统设计面试指南
> 原文:[https://www.techinterviewhandbook.org/system-design/](https://www.techinterviewhandbook.org/system-design/)
<header>
系统设计面试的目标是评估候选人设计涉及多个组件的真实软件系统的技能。系统设计问题通常交给更资深的候选人(有几年经验)。实习生通常不会被问到系统设计问题,因为很难指望实习生有足够的相关行业经验来很好地回答这类问题。
一些常见问题包括:
* 设计一个网址缩写器(例如 Bitly)
* 设计一个社交媒体网站(如 Twitter)
* 设计一个视频观看网站(如 YouTube)
* 设计一个聊天服务(如电报、松弛、不和谐)
* 设计文件共享服务(例如 Google Drive、Dropbox)
* 设计拼车服务(如优步、Lyft)
* 设计照片分享服务(如 Flickr、Pinterest)
* 设计一个电子商务网站(如亚马逊,易贝)
* 设计一个工作门户网站(例如 LinkedIn)
* 设计一个网络爬虫(如谷歌)
info
系统设计内容仍在进行中,但以下是一些资源,可同时帮助您。
## 精品课程[](#quality-courses "Direct link to heading")
* [ByteByteGo](https://bytebytego.com?fpr=techinterviewhandbook)——这是亚马逊上的畅销书《系统设计访谈书》的作者 Alex Xu 的一门新的系统设计课程。该课程涵盖系统设计基础知识,然后深入研究 10 多个著名常见产品的设计(如[设计 YouTube](https://bytebytego.com/courses/system-design-interview/design-youtube?fpr=techinterviewhandbook) 、脸书 Newsfeed 等)和多个大数据和存储系统的设计(如[设计聊天系统](https://bytebytego.com/courses/system-design-interview/design-a-chat-system?fpr=techinterviewhandbook))。对于每一次深入的探索,都有概念的解释和全面的图表,无论资历高低,都非常容易理解。
* 设计大师的“系统设计面试”——这可能是互联网上最著名的系统设计面试课程,它与大多数其他课程的不同之处在于,它完全是基于文本的,这对于推荐阅读而不是观看视频的人(比如我自己!).它包含一个流行的系统设计问题库,以及一个系统设计基础术语表。我个人已经完成了这个课程,并强烈推荐其他人使用它。
* 设计大师们的“探索高级系统设计面试”——我没试过这个,但它是由创作“探索系统设计面试”的同一批人写的,所以应该不错!在我看来,你可能不需要这个,除非你非常资深或者想要一个专家职位。
* 设计大师的“最佳系统设计”套装 -该套装允许您以折扣价购买设计大师的系统设计面试课程。最重要的是,它是终身的,而不是基于订阅的。
* 由 Exponent 主讲的[“系统设计面试课程”——该课程涵盖了系统设计的基础知识,并拥有一个包含模拟面试视频的流行系统设计问题的庞大数据库。有些问题有文本答案、数据库模式和 API 供参考(我觉得很有帮助)。虽然订阅系统设计访谈内容可能有点贵,但他们也为](https://www.tryexponent.com/courses/system-design-interview?ref=techinterviewhandbook)[数据结构](https://www.tryexponent.com/courses/swe-practice?ref=techinterviewhandbook)、[算法](https://www.tryexponent.com/courses/algorithms?ref=techinterviewhandbook)[行为访谈](https://www.tryexponent.com/courses/behavioral?ref=techinterviewhandbook)提供高质量的技术内容。涵盖技术面试准备所有方面的一站式平台的便利性非常诱人。
## 免费资源[](#free-resources "Direct link to heading")
* [系统设计入门](https://github.com/donnemartin/system-design-primer) -最全面的系统设计资源。只有当你有大把时间的时候才推荐。
* [系统设计面试](https://github.com/checkcheckzz/system-design-interview) -包含许多关于系统设计技巧、系统设计相关主题和著名公司工程博客的链接。
* [系统设计备忘单](https://gist.github.com/vasanthk/485d1c25737e8e72759f) -简明扼要的内容。在你进行系统设计面试之前,这是一次很好的复习。
## 书籍[](#books "Direct link to heading")
* [系统设计访谈-内部人员指南,第二版](https://www.amazon.com/System-Design-Interview-insiders-Second/dp/B08CMF2CQF) -初学者了解系统设计的友好资源,内容易于阅读和理解。
</header>
\ No newline at end of file
# 行为面试准备
\ No newline at end of file
# 软件工程师的行为面试:如何准备
> 原文:[https://www.techinterviewhandbook.org/behavioral-interview/](https://www.techinterviewhandbook.org/behavioral-interview/)
<header>
## 什么是行为面试[](#what-are-behavioral-interviews "Direct link to heading")
在工程职业生涯中取得成功不仅仅需要技术技能。随着工程师的级别越来越高,人际交往能力变得越来越重要。高级工程师应该具备领导和影响、解决冲突、预测风险、规划路线图等能力。
雇佣一个不能与其他人合作的天才工程师最终会成为公司的净赤字。公司不想雇佣聪明的混蛋。公司最好不要雇佣一个非常有才华的工程师,他拒绝与他人合作或者导致整个团队效率低下。公司希望雇佣合适的人,与现有员工合作愉快,并帮助团队和公司达到更高的高度,行为面试是从非技术角度确定某人是否适合合作的一种方式。
通常,行为面试问题可以分为几种类型:
1. 了解你的职业偏好、抱负和计划
2. 讨论简历中写的经历或项目的细节
3. “告诉我一次你”类型的问题,描述你如何展示某些特质或对某个情况做出反应
## 行为面试的重要性[](#the-importance-of-behavioral-interviews "Direct link to heading")
公司重视行为技能,并根据这些技能来评估候选人。在撰写本文时,脸书有一轮(四轮中的一轮)致力于行为访谈。Airbnb 有两轮(共六轮)专门用于行为面试/公司契合度。Lyft 有一轮(共五轮)由招聘经理专门针对过去的经验和情境问题。
## 行为面试如何评估[](#how-are-behavioral-interviews-evaluated "Direct link to heading")
与技术面试不同,行为面试在评估标准方面有更多的差异。然而,大多数顶级科技公司都用他们的公司价值观来评估候选人。面试官通常需要填写一个部分,评估候选人的行为是否符合公司价值观。正是因为这个原因,你应该搜索一家公司的文化和价值观,并确保你在回答中体现出来。你还会发现,与目前在你申请的公司工作的一位关系人交谈,可以更好地了解团队中通常重视哪些价值观。
评估的常见价值的一些示例如下:
* 移情 -设身处地为他人着想,并试图理解他人的推理
* **积极主动并愿意身兼数职** -在形势需要时挺身而出
* **项目管理** -能够协调多个工作流,以满足时间要求并解除任务障碍
* **冲突管理**——能够通过解释和确保不留下任何怨恨来管理他们之间和/或其他各方之间的冲突
## 如何准备行为面试[](#how-to-prepare-for-behavioral-interviews "Direct link to heading")
1. 学习明星答题格式
2. 准备好常见问题的答案
3. 准备经验来展示适合公司的文化/核心价值观
4. 尝试模拟行为面试
5. 使用结构化课程
### 1.学习明星答题格式[](#1-learn-the-star-answer-format "Direct link to heading")
星形模式是一个帮助你组织行为问题答案的框架——尤其是那些需要你讨论以前经历的问题
* **情景** -面试官想让你介绍一个你最近遇到的挑战和所处的情况
* 任务 -你需要完成什么?面试官会看你在这种情况下想要达到什么目的。一些绩效发展方法使用“目标”而不是“任务”。求职面试的候选人描述了他们为自己设定的“目标”,而不是外部强加的“任务”,强调了他们自己内在的表现和发展表现的动机
* 动作 -你做了什么?面试官会寻找关于你做了什么,为什么做,有什么选择的信息
* **结果** -你行动的结果是什么?你通过自己的行动实现了什么,学到了什么?体验后你采取了哪些措施来改进?
#### 如何将 STAR 应用于行为面试问题 [](#example-of-how-to-apply-star-to-a-behavioral-interview-question "Direct link to heading") 的示例
这里有一个如何使用星型模式来回答这个问题的例子:“告诉我一个你有矛盾并且需要影响别人的时候”。
#### 情况[](#situation "Direct link to heading")
> “我是一个学校项目的团队领导,这个项目是关于构建一个社交网络移动 web 应用程序的。我们设计师的期中考试快到了,没有时间制作模型。我们的前端人员催他做模型,这样他就可以继续工作,这让设计师很紧张。团队里的气氛很紧张。”
#### 任务[](#task "Direct link to heading")
> “作为团队领导,我必须化解前端开发人员和设计人员之间的紧张关系,以便团队能够和平合作,按时完成项目。”
#### 动作[](#action "Direct link to heading")
> “我与前端开发人员交谈,问他为什么要催促设计师进行设计。他说他想早点得到设计,因为如果设计师最终设计出不同的东西,那么重建就是浪费时间。我向他解释说,期中考试的日期超出了设计师的控制范围,我们必须更加理解彼此的时间表。我与设计师交谈,大致了解他的想法,并问他什么时候可以承诺生产高保真设计。他回答说,期中考试一结束,他就可以开始写。我向他解释了为什么前端开发人员要求他提供样机,前端开发人员没有恶意,只是希望项目成功。作为一个在 UI/UX 设计方面有一些经验的人,我想出了线框模型,让设计师批准,然后把它们交给前端开发人员开始构建。我鼓励前端开发人员使用占位符,现在不要太关心细节。我们可以先构建非 UI 部分(身份验证,与 API 挂钩),然后调整像素并添加修饰。前端开发人员同意并继续使用这种方法。我向前端开发人员解释说,设计师将在期中考试后通过我们的模型,日期是<>。”
#### 结果[](#result "Direct link to heading")
> “当我们的设计师结束期中考试时,他带回了非常适合线框的漂亮模型。我们的前端开发人员非常仔细地实现了它们。我们最终在这个项目上获得了最高分,成为了一个伟大的团队。”
### 2.准备好常见问题的答案[](#2-prepare-your-answers-to-commonly-asked-questions "Direct link to heading")
下一个自然的步骤是开始准备常见的行为面试问题的答案。你可以参考[我的 30 个问题列表](/behavioral-interview-questions/),这些问题是在顶级科技公司中整理出来的。
虽然大多数人可能倾向于死记硬背,但最好是写下每个问题的要点,并在面试前练习复述,这样你的答案会更自然。
### 3.准备经验,展示适合公司文化/核心价值观的内容[](#3-prepare-experiences-to-showcase-fit-to-the-companys-culture--core-values "Direct link to heading")
如前所述,大多数顶级科技公司在行为面试中使用他们的公司价值观来评估候选人。因此,你应该做研究,找出这些价值观是什么,并确保你准备好了适合展示的经历。
### 4.尝试模拟行为面试[](#4-try-out-mock-behavioral-interviews "Direct link to heading")
如果你想和顶尖科技公司的专业面试官一起练习行为面试,那就安排一次[面试。io 拥有来自脸书、亚马逊、Apply、谷歌和微软的大量面试官。我作为采访者和被采访者都使用过](https://iio.sh/r/DMCa)[interview . io](https://iio.sh/r/DMCa),可以保证在这个平台上有良好的体验。
### 5.使用结构化课程[](#5-use-structured-courses "Direct link to heading")
我真的不认为一个人需要参加行为面试的课程,但你的里程可能会有所不同。我见过一些应聘者因为没有通过行为测试而被拒绝,尽管他们在编码和系统设计面试中做得非常好。如果你想参加行为面试课程,我推荐以下课程:
* Exponent 的“行为面试” -虽然 Exponent 也有关于技术内容的课程,但真正让他们从其他面试准备平台中脱颖而出的是他们为非软件工程角色(如产品管理和产品营销)提供的内容。他们的行为面试课程是视频的混合(由 Exponent CEO 本人!)和文本,浏览最常见的问题,并向你传授帮助你赢得面试的技巧。最重要的是,他们还有一个行为问题的面试题库,里面有来自该平台有用社区的回答。虽然订阅行为访谈内容可能有点贵,但他们也为[系统设计](https://www.tryexponent.com/courses/system-design-interview?ref=techinterviewhandbook)[数据结构](https://www.tryexponent.com/courses/swe-practice?ref=techinterviewhandbook)[算法](https://www.tryexponent.com/courses/algorithms?ref=techinterviewhandbook)提供高质量的技术内容。涵盖技术面试准备所有方面的一站式平台的便利性非常诱人。
* Educative 上的“寻找行为面试”——与 Educative 上的其他课程一样,本课程是基于文本的,他们认为基于文本的课程比视频课程更有效。这门课程突出的一点是,他们教你行为面试的**模式**,而不仅仅是记忆问题和准备答案。
</header>
\ No newline at end of file
# 30 个最常见的软件工程师行为面试问题
> 原文:[https://www . techinterviewphandbook . org/behavioral-interview-questions/](https://www.techinterviewhandbook.org/behavioral-interview-questions/)
<header>
在软件工程师面试过程中,与技术面试相比,行为面试可能看起来更加多样和无组织。然而,在大多数情况下,面试官实际上只是想更好地了解你,为了达到这个目的,总会问一些常见的问题。
## 顶级科技公司最常问的行为问题[](#most-commonly-asked-behavioral-questions-across-top-tech-companies "Direct link to heading")
以下是顶级科技公司最常问的 30 个行为面试问题:
1. 你为什么想去 X 公司工作?
2. 你为什么想离开现在/上一家公司?
3. 你对下一个角色有什么期待?
4. 告诉我你和同事发生冲突的时候。
5. 告诉我一个你有矛盾并且需要影响别人的时候。
6. 你目前在做什么项目?
7. 你当前项目中最具挑战性的方面是什么?
8. 在过去的 6 个月里,你修复的最困难的 bug 是什么?
9. 你如何应对挑战?列举一个你在项目中遇到的困难挑战,你是如何克服的,以及你学到了什么。
10. 你兴奋什么?
11. 什么让你沮丧?
12. 想象一下这是你在公司的第一天。你想做什么?你会改进哪些功能?
13. 你参与过的最有趣的项目是什么?它们与公司的环境有什么关系?
14. 告诉我你和你的经理有分歧的一次。
15. 谈谈你最感兴趣的一个项目,或者你做得最好的一个项目。
16. 你最好的一天工作是什么样的?
17. 在你之前的项目中,什么是你必须推动的?
18. 你在职业生涯中收到的最有建设性的反馈是什么?
19. 什么是你必须坚持数月的事情?
20. 告诉我你在一个紧迫的期限前完成的一次经历。
21. 如果这是你在我们公司的第一次年度评估,我现在会告诉你什么?
22. 时间管理已经成为生产力的一个必要因素。举一个你在工作中学习和运用的时间管理技巧的例子。
23. 告诉我你和同事相处时遇到的一个问题。
24. 你工作的哪些方面最常受到批评?
25. 你如何处理对你工作的批评?
26. 你认为什么优势对你的工作岗位最重要?
27. 你的同事会用什么词来形容你?
28. 在被雇佣后的前六个月,你希望实现什么目标?
29. 告诉我为什么你很适合这个职位。
## Airbnb 软件工程师行为面试问题[](#airbnb-software-engineer-behavioral-interview-questions "Direct link to heading")
虽然热爱旅行或欣赏 Airbnb 的增长可能是很好的答案,但试着展示你与该产品的深厚联系。
* “属于任何地方”对你意味着什么?
* 今天你会解决世界上哪些大问题?
* 你为什么喜欢 Airbnb?
* 如果你有无限的预算,可以给一个人买一件礼物,你会买什么,会给谁买?
* 如果你有无限的预算,可以去某个地方,你会去哪里?
* 与我们分享你的一次旅行。
* 在过去的 6 个月里,你参与的校内外最具挑战性的项目是什么?
* 你不想从上一份实习/工作中得到什么?
* 给我一个你是一个好主人的例子。
* 你想从 Airbnb 体验中去掉什么?
* 你能在几分钟内教会面试官什么新东西?
* 告诉我你为什么想在这里工作。
* 你给过或收到过的最好的礼物是什么?
* 告诉我一次你感到不舒服的时候,你是如何处理的。
* 解释你最近参与的一个项目。
* 你怎么看待 Airbnb?
* 告诉我一些关于你自己的事情,以及为什么你非常适合这个职位。
* 列举一个公司的客户服务给你留下深刻印象的例子。
* 你是如何在大型项目以及多个内部团队中与高级管理层合作的?
* 告诉我你不得不告诉某人一个可怕的消息的时候。
* 如果你是一只沙鼠,你会是哪只沙鼠?
* 这家公司让你感到兴奋的是什么?
* Airbnb 对我们的客人和主人有什么影响?
* 我们使命的哪一部分最能引起你的共鸣?
来源:[玻璃门](https://www.glassdoor.com/Interview/Airbnb-Interview-Questions-E391850.htm)
## 亚马逊软件工程师行为面试问题[](#amazon-software-engineer-behavioral-interview-questions "Direct link to heading")
* 你如何处理一个失败的截止日期?
* 你为什么想去亚马逊工作?
* 说一个你和队友发生矛盾的情况。
* 在你的职业经历中,你有没有在没有得到经理批准的情况下做一些事情?
* 告诉我一个你会做与你实际做的不同的事情的情况。
* 你曾经犯过的最严重的错误是什么?
* 描述人力资源对你意味着什么。
* 你会如何改进亚马逊的网站?
来源:[玻璃门](https://www.glassdoor.com/Interview/Amazon-Interview-Questions-E6036.htm)
## 字节跳动软件工程师行为面试试题[](#bytedance-software-engineer-behavioral-interview-questions "Direct link to heading")
* 关于 < 角色 > 你知道些什么,为什么?
* 从头到尾给我介绍一个你推出的产品
* 你之前的项目中最大的成就是什么?
* 告诉我最近的一次失败,你从这次经历中学到了什么
* 你为什么想在字节跳动工作?
* 什么使你非常适合这个职位?
* 这个角色让你兴奋的是什么?
来源:[玻璃门](https://www.glassdoor.sg/Interview/ByteDance-Interview-Questions-E1624196.htm)
## Dropbox 软件工程师行为面试问题[](#dropbox-software-engineer-behavioral-interview-questions "Direct link to heading")
* 谈谈你最喜欢的项目。
* 如果你被这里雇用,你会怎么做?
* 描述一个你如何解决技术问题的经历。具体到诊断和过程。
来源:[玻璃门](https://www.glassdoor.com/Interview/Dropbox-Interview-Questions-E415350.htm)
## 受聘软件工程师行为面试问题[](#hired-software-engineer-behavioral-interview-questions "Direct link to heading")
* 说说你自己吧。
* 你最大的优势和发展领域是什么?
* 你为什么对这个机会感兴趣?
* 你期望的薪水是多少?
* 你为什么想离开现在的公司?
* 告诉我你的工作职责变得有点不堪重负的时候。你做了什么?
* 给我一个你和团队成员意见不一致的例子。你是怎么处理的?
* 告诉我你最近在工作中遇到的一个挑战。你是怎么解决的?结果如何?
* 五年后你想在哪里?
* 告诉我你需要从没有回应的人那里得到信息的时候。你做了什么?
来源:[玻璃门](https://hired.com/blog/candidates/10-top-interview-questions-how-to-answer/)
## Lyft 软件工程师行为面试问题[](#lyft-software-engineer-behavioral-interview-questions "Direct link to heading")
* 说说你迄今为止最感兴趣/最具挑战性的项目。
* 为什么选择 Lyft?你对下一个角色有什么期待?
来源:[玻璃门](https://www.glassdoor.com/Interview/Lyft-Interview-Questions-E700614.htm)
## Palantir 软件工程师行为面试问题[](#palantir-software-engineer-behavioral-interview-questions "Direct link to heading")
* 90%的人不同意你的什么观点?
* **你身边有什么破事?**
* 你如何与难相处的同事相处?想想你解决冲突的具体例子。
* 你是如何争取到难相处的员工的?
* 告诉我一个你过去做过的分析问题。
* 你的三个优点和三个缺点是什么?
* 如果你负责为 Palantir 挑选项目,你会试图解决什么问题?
* 你现在的公司有哪些优点和缺点?
* 你的经理会怎么评价你?
* 向你祖母描述帕兰提尔。
* 教我一些你学到的东西。
* 告诉我你预言某事的一次。
* 如果你的上司给你打 1-10 分,他们会给你打多少分?
* 你最近做过最好玩的事是什么?
* 说说你是如何成为今天的你的故事,是什么让你申请了 Palantir。
来源:[玻璃门](https://www.glassdoor.com/Interview/Palantir-Technologies-Interview-Questions-E236375.htm)
## Slack 软件工程师行为面试问题[](#slack-software-engineer-behavioral-interview-questions "Direct link to heading")
* 说说你实习的情况。
* 你为什么想加入 Slack?
* 告诉我你过去的项目。
* 给我解释一下你最难的项目和工作架构。
* 除了技术知识,你在实习期间还学到了什么?
* 如果有人有不同的观点去做一个项目,比如不同的编程语言,你会怎么处理这种情况?
* 你最感兴趣的科目是什么,为什么?
* 你在 Slack 里发现什么 bug 了吗?
* 你最喜欢的功能是什么,为什么?
来源:[玻璃门](https://www.glassdoor.com/Interview/Slack-Interview-Questions-E950758.htm)
## 栈溢出软件工程师行为面试问题[](#stack-overflow-software-engineer-behavioral-interview-questions "Direct link to heading")
* 你造了什么?
* 你遇到过的最难的技术问题是什么?
* 你是怎么解决的?
* 你认为自己五年后会怎样?
* 你为什么想在这里工作?
* 你如何处理与同事的分歧?
来源:[玻璃门](https://hired.com/blog/candidates/10-top-interview-questions-how-to-answer/)
## 条纹软件工程师行为面试试题[](#stripe-software-engineer-behavioral-interview-questions "Direct link to heading")
* 您如何跟上最新技术的发展?
* 解释一下你最近参与的一个困难的项目。
* 你认为自己五年后会怎样?
来源:[玻璃门](https://www.glassdoor.com/Interview/Stripe-Interview-Questions-E671932.htm)
## Twitter 软件工程师行为面试问题[](#twitter-software-engineer-behavioral-interview-questions "Direct link to heading")
* 你的前任老板会说你最大的优点是什么?
来源:[玻璃门](https://www.glassdoor.com/Interview/Twitter-Interview-Questions-E100569.htm)
</header>
\ No newline at end of file
# 软件工程师面试:打造完美的自我介绍
> 原文:[https://www.techinterviewhandbook.org/self-introduction/](https://www.techinterviewhandbook.org/self-introduction/)
<header>
“介绍一下你自己”或者“简单介绍一下你的个人资料”几乎总是你在软件工程师面试中遇到的第一个问题。本指南教你如何通过精心制作完美的自我介绍来最大化这个给面试官留下深刻印象的机会。
面试官希望和自己喜欢的候选人一起工作。留下一个好的/深刻的印象,这会增加你成功的机会。我们大多数人对自我介绍并不陌生,因为我们时不时会遇到新的人,并且必须每隔一段时间介绍一下自己。然而,面试中的自我介绍与现实生活略有不同——你需要根据自己的优势进行调整——根据你申请的职位和公司量身定制自我介绍!你的自我介绍随着你的成长和职业生涯的不同阶段而发展。
在回答“告诉我关于你自己的情况”时,你可以将问题重新表述为:
> “告诉我你的科技之旅。你是如何对编码感兴趣的,为什么 web 开发(或者用其他特定工作技能代替)非常适合你?这如何适用于我们的角色或公司目标?”花宝贵的时间谈论与工作无关的事情可能不是一个好主意!
## 做一个电梯推介[](#make-an-elevator-pitch "Direct link to heading")
“电梯推销”源于记者试图向编辑推销一个想法。唯一能抓住编辑的时间是在电梯里,她只有大约 30 秒的时间。电梯间推介的关键要素包括:
* **短**——你的时间有限!
* 直接 -由于时间有限,你应该直奔主题
* 引人注目的 -展示你最吸引人的想法
无论你是在一个有数百名候选人的招聘会上,而你的时间有限,或者你只是向潜在的关系人或客户解释你是谁,能够快速简洁地清晰准确地描述你的知识和技能是很重要的。你的自我介绍是对你自己的电梯推销!
以下是为你的软件工程师自我介绍准备一个好的电梯推销的一些技巧:
### 1.从基本背景信息[开始](#1-start-with-basic-background-information "Direct link to heading")
包括你是谁,为谁工作(或者学校和专业),做什么工作。
* 实习经历 -你应该提及以下内容:姓名、学校和专业、关注领域、过去的实习经历和/或值得关注的项目
* 全职 -你应该提到以下内容:姓名、过去的公司、值得关注的项目(最好是他们听说过的公共消费产品)
这看起来眼熟吗?应该是,因为和你的简历差不多!你的简历是你的知识和经历的浓缩版,你的自我介绍本质上是你简历的浓缩版。随着年龄的增长,职业经历变得越来越重要,学校背景变得不那么重要。因此,你的自我介绍会随着你的资历加深而改变。
### 2.亲吻(保持简单甜蜜)[](#2-kiss-keep-it-simple-and-sweet "Direct link to heading")
告诉他们你最喜欢/印象最深刻的项目中的一些亮点,如果这些项目令人印象深刻,包括一些数字或你已经克服的挑战。不要深究你如何逆向工程一个游戏和解密一个包,以预测何时使用你的 DKP 下降。告诉他们执行摘要:“我通过解密 Y 数据包来预测 z,对 X 游戏进行了逆向工程。”如果这引起了他们的兴趣,他们可能会自己提出进一步的问题。
### 3.他们为什么要你?[](#3-why-do-they-want-you "Direct link to heading")
告诉面试官为什么你会得到一份好工作。你的经历与公司相关吗?您是否使用过与该公司类似的技术堆栈或开发过相关产品?你有什么独特的才能让他们相信你有能力为公司做出贡献?
### 4.练习![](#4-practice "Direct link to heading")
最后,你必须练习你的音调!对你的技能有一个很好的、简洁的总结,只有当你能够快速的表达时才有帮助!你应该练习保持一个快速但容易跟上的速度,既不会让他们不知所措,也不会让他们感到厌烦。这是一种不稳定的平衡,但可以通过实践来解决。
想出你的自我介绍后,把它放在你将来可以参考/调整的地方。记住它们,将来你可以在需要的时候使用它们,但不要听起来像是在回忆,而是在说出来。听起来很自然!
手头有一份电梯推介会是建立关系网和获得新工作机会的好方法。经常会有你无法准备面试或会议的时候,有一个练习过的推销是非常方便的。
## 软件工程师自我介绍的好例子[](#good-examples-of-software-engineer-self-introductions "Direct link to heading")
### 示例 1:Meta的前端工程师
#### 自我介绍[](#self-introduction "Direct link to heading")
> “大家好,我是 XXX,2015 年毕业于新加坡国立大学,获得计算机科学学位。我的兴趣是前端工程,我喜欢创造漂亮和高性能的产品,以及令人愉快的用户体验。
>
> 回到学校后,我设计并开发了一个 web 应用程序,NUSMods,它解决了每学期课程和时间表规划的一个大问题。它每月的浏览量超过 100 万次,被超过 40,000 名新加坡国立大学的学生甚至一些教授使用。它是使用现代网络技术栈——React、Redux、Jest、Babel、Flow、webpack 构建的,并且是移动响应的。"
>
> 我对 Meta 的前端工程师职位很感兴趣,因为我使用 Meta 开源前端技术已经有一段时间了,并且受到 Meta 的使命和开源文化的启发。
#### 细分[](#breakdown "Direct link to heading")
* "我喜欢创造漂亮的、高性能的产品,以及令人愉快的用户体验."
* 前端工程师应具备的素质
* “它每月的页面浏览量超过 100 万次,超过 3 万名新加坡国立大学本科生甚至一些教授都在使用它。”
* 提及一些突出的项目
* "它是使用现代网络技术栈——React、Redux、Jest、Babel、Flow、webpack 构建的,并且是移动响应的."
* 元技术栈!这也暗示了你要让自己跟上现代网络技术的发展
### 例 2:Lyft的前端工程师
#### 自我介绍[](#self-introduction-1 "Direct link to heading")
> “大家好,我是 XXX,2015 年毕业于新加坡国立大学,获得计算机科学学位。我的兴趣是前端工程,我喜欢创造具有令人愉快的用户体验的漂亮的高性能产品。
>
> 我之前在 Grab 工作,领导 Grab for Work 项目。Grab for Work 是一项为公司提供的服务,旨在方便公司的交通费用。公司可以创建员工小组,制定乘车政策,并与员工分享公司支付方式。我和另一名工程师在 React/Redux 和 Golang 堆栈上花了 3 个月的时间构建了这个项目。"
>
> 我对 Lyft 的前端工程师职位很感兴趣,因为我喜欢在这个拼车领域工作,喜欢创造产品来改善用户的生活。
#### 细分[](#breakdown-1 "Direct link to heading")
> "我喜欢创造漂亮的、高性能的产品,以及令人愉快的用户体验."
同上,一个前端工程师应该具备的素质。
> "我之前在 Grab 工作,领导 Grab 的工作项目."
Lyft 是 Grab 的姐妹公司!事实上,他们过去甚至有过合作关系。大多数 Lyft 工程师以前应该听说过 Grab,提到它会引起他们的注意。
> “我和另一名工程师花了 4 个月的时间在 React/Redux 和 Golang 堆栈上构建了这个项目。”
承认你与他人一起工作。只用 2 个人在 3 个月内构建一个非平凡的系统对于一个非平凡的系统来说是相当不错的。Lyft 也将 Golang 用于其高性能系统。
</header>
\ No newline at end of file
# 软件工程师面试:面试结束时最好问的问题
> 原文:[https://www.techinterviewhandbook.org/final-questions/](https://www.techinterviewhandbook.org/final-questions/)
<header>
在你的软件工程师面试结束时,无论是技术性的还是非技术性的,你总会想到面试官会问你“还有什么最后的问题吗?”。
这个问题实际上根本不是一个真正的问题——候选人通常会问一些问题。作为一名面试官,没有任何问题的候选人可能会显得对这个职位不感兴趣。
除此之外,你问的问题揭示了你所关心的事情。如果问得好,这可能是一个非常可预测的机会,让你留下好印象,同时也了解更多关于这个角色的信息(包括发现潜在的危险信号)。
在这里,我提出了在你的软件工程师面试结束时要问的问题,出于各种目的。用**粗体**表示的是那些倾向于让面试官说“这是个好问题”并停下来思考一会儿的问题。
## 了解更多技术工作的最佳问题[](#best-questions-to-ask-for-knowing-more-about-technical-work "Direct link to heading")
* 公司/团队面临的工程挑战是什么?
* 最近发生的最严重的技术失误是什么?你们是怎么处理的?事后实施了哪些改变以确保不再发生?
* 公司目前面临的最昂贵的技术决策是什么?
* 到目前为止,你在这里完成的最有成就感/最激动人心/技术最复杂的项目是什么?
* **我在 x 领域有/没有经验。这对我取得成功有多重要?**
* 你如何评价新技术?谁做最后的决定?
* 你怎么知道每天要做什么?
* 你如何描述你的工程文化?
* 加入公司后,你的角色发生了怎样的变化?
* 你的筹码是多少?这个特定堆栈背后的基本原理/故事是什么?
* 您更倾向于推出自己的解决方案还是依赖第三方工具?具体案例中的基本原理是什么?
* 工程团队如何在功能请求和工程维护之间平衡资源?
* 你衡量什么?你最重要的产品指标是什么?
* 你多久换一次团队?是什么让你加入了现在这个团队?如果你想转移团队,需要做些什么?
* 公司有什么资源让新员工学习产品和流程?是否有规格、要求、文档?
* 你认为我的专业知识和这个团队有什么关系?我能增加什么独特的价值?
## 了解 [](#best-questions-to-ask-for-knowing-more-about-the-role "Direct link to heading") 角色的最佳问题
* 招聘这个职位时,你会注意哪些品质?
* 如果我加入你的团队,你希望我解决的最重要的问题是什么?
* 在这个角色中,典型的一天是什么样的?
* 当前团队的优势和劣势是什么?正在采取什么措施来改善这些弱点?
* 公司有什么资源让新员工学习产品和流程?是否有规格、要求、文档?
* 如果我加入这个团队,我将从事什么工作?我将与谁最密切地合作?
## 了解更多文化和福利的最佳问题[](#best-questions-to-ask-for-knowing-more-culture-and-welfare "Direct link to heading")
* 在这里工作最让你沮丧的是什么?
* 在这家公司工作有什么独特之处是你在其他地方没有经历过的?
* 你希望你的工作有哪些不同之处?
* 如何衡量个人绩效?
* 你喜欢在这里工作的什么?
* 你在家/远程工作的政策是什么?
* 公司如何培养和培训员工?
* 公司文化鼓励企业家精神和创造力吗?你能给我举些具体的例子吗?
## 更多了解团队领导或管理的最佳问题[](#best-questions-to-ask-to-know-more-about-team-leadership-or-management "Direct link to heading")
这些问题适合问工程经理或高级管理层,如首席执行官、首席技术官、副总裁,尤其适用于谷歌面试的团队匹配阶段或招聘人员与各团队经理安排的招聘后电话。
* 你如何培训/提升新加入团队的工程师?
* 对你的团队/项目来说,成功是什么样的?
* 当前团队的优势和劣势是什么?正在采取什么措施来改善这些弱点?
* 你能告诉我你解决人际冲突的一次经历吗?
* 你是如何成为经理的?
* 你的工程师如何知道每天要做什么?
* 你的团队目前面临的最大挑战是什么?
* 你如何衡量个人表现?
* 多长时间进行一次一对一会谈?
* 现在的团队构成是什么样的?
* 有哪些机会可以转换角色?这是如何工作的?
* 两名高级团队成员在一个技术问题上意见不一。你是怎么处理的?
* 你以前在职业生涯的某个阶段管理过表现不佳的员工吗?你做了什么,怎么做的?
* 你在哪里花费更多的时间,高绩效者还是低绩效者?
* 有时候,在什么对你的团队成员最好和什么对团队最好之间有一个权衡。举例说明你是如何处理这件事的,为什么。
* 举一个你面临困难的指导/训练挑战的例子。你做了什么,为什么?
* 你的管理哲学是什么?
* 在管理像我们这样的团队时,数据和指标的作用是什么?
* 经理在技术决策中扮演什么角色?
* 你在团队中所做的改进团队的例子是什么?
* 如果我加入你的团队,你希望我解决的最重要的问题是什么?
* 你的团队将提供什么样的发展机会?
* 如果我加入这个团队,我将从事什么工作?我将与谁最密切地合作?
## 更多了解公司方向的最佳问题[](#best-questions-to-ask-to-know-more-about-company-direction "Direct link to heading")
* 公司如何决定下一步的工作?
* 你有什么把握这家公司会成功?
* 哪些公司是你的主要竞争对手,你的公司与众不同的地方是什么?
* 你现在最优先考虑的是什么?比如新功能,新产品,固化现有代码,降低运营开销?
</header>
\ No newline at end of file
# 薪金和聘用谈判准备
\ No newline at end of file
# 了解薪酬
> 原文:[https://www . techinterviewphandbook . org/understanding-compensation/](https://www.techinterviewhandbook.org/understanding-compensation/)
<header>
在选择工作机会时,薪酬是最重要的因素之一。这部分给你一个科技行业薪酬的常见组成部分的分类。
在大多数公司,你的薪酬将由基本工资、绩效奖金和股票组成。有关薪酬数据,请查看 [Levels.fyi](https://www.levels.fyi?ref=TechInterviewHandbook&utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation)
## 基本工资[](#base-salary "Direct link to heading")
基本工资是你在工作中获得的固定金额的工资,不受公司表现或行业发展的影响。这是你薪酬中唯一不变的部分。
湾区的应届毕业生通常有望获得 10 万美元以上的基本工资(税前)。众所周知,脸书/谷歌应届毕业生的薪水在 10 万至 15 万美元之间。
初创公司通常会为应届毕业生提供略高的薪酬(12 万至 13 万美元),以弥补股权赠款流动性的不足(还不是真正的现金)。
基本工资不会随着你的资历加深而线性增长;它最终会逐渐消失。随着员工在公司中的职位越来越高,他们的薪酬中来自公司相关因素(如奖金和股权)的比例就越高。这是因为高级员工被期望影响他们周围的人并推动公司前进。一个高级员工的表现将基于公司整体表现的好坏;个人因素就不会那么多了。
这个系统有一些例外。像网飞这样的公司支付行业最高水平的薪酬(有时甚至超过脸书/谷歌),并给予员工将全部薪酬作为基本工资的选择权,也就是说,将股权部分转换为基本工资。对于风险厌恶者来说,这是一个很好的选择。
## 奖金[](#bonus "Direct link to heading")
奖金通常每半年发放一次,通常取决于几个因素——资历、个人在该时期的表现、公司在该时期的表现。
* **资历级别** -这通常是基本工资的乘数,该乘数随着员工级别的提升而增加
* **个人绩效** -这是员工在该时间段内表现的乘数。例如,达到预期会产生 100%的乘数,超过预期会产生> 100%的乘数。像脸书和苹果这样的公司会给表现最好的员工丰厚的奖励,对于表现非常好的员工,这个乘数会高达 300%
* **公司业绩** -公司表现如何。这个乘数对所有员工都是一样的
### 例题[](#examples "Direct link to heading")
鲍勃是一名刚从大学毕业的软件工程师。他的基本工资是 10 万美元,是一名应届毕业生(资历乘数:10%),打破了一半人的期望(个人业绩乘数:200%),他的公司做得相当好(公司业绩乘数:120%)。对于这一半,他的奖金如下:
**奖金:** 10 万 x 50%(半年)x 10%(资历)x 200%(个人业绩)x 120%(公司业绩)= 12000
Alice 是一名拥有 10 年专业经验的工程经理。她的基本工资是 220,000 美元,是一位经验丰富的工程经理(资历乘数:20%),超过了一半人的预期(个人绩效乘数:150%),她的公司表现相当出色(公司绩效乘数:130%)。对于这一半,她的奖金如下:
**奖金:** 22 万 x 50%(半年)x 20%(资历)x 150%(个人业绩)x 130%(公司业绩)= 42900
因此,你获得的奖金数额可能会有很大差异,高级员工从奖金中获得的薪酬占总薪酬的比例会更高。
## 权益/股票[](#equitystocks "Direct link to heading")
公平是技术工作和非技术工作的区别。股权是指公司的股份;这意味着所有权,并激励员工为公司的最大利益而工作。它们可能是一个人薪酬的重要组成部分,有时甚至超过基本工资,尤其是对高级员工而言。
股权通常在一段时间内(通常为 4 年)授予(可供您使用),并且可以每月/每季度/每年平均授予。可行权悬崖是指可行权开始前的最短时间。例如,如果你被授予 4,800 股 4 年期股票,期限为 1 年,按月授予,你将在第一年年末获得 1,200 股,在随后的 3 年中每月获得 100 股。
在公司上市(IPO)或被收购之前,股权通常一文不值。然而,有些情况下,即使公司还没有上市,你也可以在内部出售你的股票。注意你正在让自己陷入什么样的境地!
并非所有的股权都受到平等对待。根据你加入的公司和该公司所处的阶段,你可能会获得以下类型之一:股票期权或股票奖励。
### 股票期权[](#stock-options "Direct link to heading")
股票期权通常由中期公司给予。股票期权不同于股票,它代表的是对一个公司的直接所有权!股票期权是以给定的执行价格购买股票的**期权/权利**,因此它不是免费的。然而,每只股票的成本通常很低,并固定在一个执行价格,该价格等于股票授予您时的公平市场价值。你被保证能够以那个价格购买股票,不管将来价格是否上涨。
当你离开一家公司时,有一个行权窗口(在期权到期前给你行权的最后期限),所以在计划离职时,有足够的流动现金购买期权是很重要的。
### 股票授予[](#stock-grants "Direct link to heading")
股票授予通常被称为限制性股票单位(RSU ),它意味着你立即拥有股票。如果公司是上市公司,你可以在规定的交易窗口卖出。
关于这个话题的更多阅读可以在[股权薪酬指南](https://github.com/jlevy/og-equity-compensation)和文章[“我希望在加入独角兽之前我已经了解了什么股权”](https://gist.github.com/yossorion/4965df74fd6da6cdc280ec57e83a202d)中找到。
## 签约奖金[](#signing-bonus "Direct link to heading")
这是在您加入公司时一次性支付给您的款项。这一金额通常在 10,000 至 20,000 美元之间,但甚至可以高达 50,000 美元(谷歌)和 100,000 美元(脸书)。
签约奖金可能有附加条件,比如如果员工在一年内离职,必须返还按比例分配的金额。在你签署要约之前,确保你知道他们。
## 杂项奖金/津贴[](#misc-bonusesperks "Direct link to heading")
虽然这些额外津贴不完全是现金,但它们可以帮你省钱,这几乎相当于获得更多补偿。如果有机会的话,一定要从你的招聘人员那里了解更多。
* 免费餐 -湾区的食物并不便宜,在工作日提供一些食物每年可以节省几千美元,还可以节省外出寻找食物的时间
* 搬迁奖金 -如果你是从国外搬来的,会很有帮助。这可以部分抵消搬迁期间产生的费用
* 健康和牙科保险/计划 -公司通常与保险公司合作,为员工提供健康和牙科计划。这些费用每年可达几千美元,在医疗费用昂贵的地方尤其有用
* 穿梭巴士服务 -湾区的公共交通不是很好,最常见的通勤方式是开车。能够乘坐班车服务有助于节省汽油、交通费用,并让你在通勤期间有时间做其他事情
## 例题[](#examples-1 "Direct link to heading")
以下是来自谷歌和脸书的关于不同级别工资的众包数据:
### 谷歌[](#google "Direct link to heading")
| 水平 | 总计(美元) | 基础 | 奖金 | 库存(/年) |
| --- | --- | --- | --- | --- |
| L3(入门级) | $191,000 | $131,000 | $21,000 | $39,000 |
| L4(瑞典) | $267,000 | $158,000 | $28,000 | $81,000 |
| L5(高级 SWE) | $355,000 | $188,000 | $37,000 | $130,000 |
| L6(瑞典工作人员) | $489,000 | $223,000 | $50,000 | $214,000 |
| L7(高级职员 SWE) | $672,000 | $263,000 | $79,000 | $330,000 |
| L8(首席工程师) | $1,020,000 | $331,000 | $119,000 | $572,000 |
截至 2021 年 8 月的数据。来源:[levels . FYI](https://www.levels.fyi/company/Google/salaries/Software-Engineer/?ref=TechInterviewHandbook&utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation)T3】
### 脸书[](#facebook "Direct link to heading")
| 水平 | 总计(美元) | 基础 | 奖金 | 库存(/年) |
| --- | --- | --- | --- | --- |
| E3(入门级) | $180,000 | $122,000 | $14,000 | $43,000 |
| E4(瑞典) | $267,000 | $162,000 | $18,000 | $85,000 |
| E5(高级 SWE) | $390,000 | $197,000 | $35,000 | $157,000 |
| E6(员工福利) | $598,000 | $234,000 | $54,000 | $309,000 |
| E7(高级职员瑞典) | $921,000 | $272,000 | $81,000 | $567,000 |
截至 2021 年 8 月的数据。来源:[levels . FYI](https://www.levels.fyi/company/Facebook/salaries/Software-Engineer/?ref=TechInterviewHandbook&utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation)T3】
</header>
\ No newline at end of file
# 谈判
> 原文:[https://www.techinterviewhandbook.org/negotiation/](https://www.techinterviewhandbook.org/negotiation/)
<header>
## 总是协商[](#always-negotiate "Direct link to heading")
如果你收到了一份工作邀请(或者更好的邀请),恭喜你!你可能会松一口气,认为最艰难的部分已经过去了。是的,但不完全是!对大多数人来说,他们找新工作的原因是为了加薪,而薪资谈判是实现这一目标的最后一步。
这里有一些招聘人员不想让你知道的事情- 在大多数情况下,你的提议都有商量的余地,招聘人员希望候选人进行协商。**公司给你的最初报价从来都不是最好的。**在我上次找工作的经历中,我收到了许多顶级科技公司的邀请,比如脸书、谷歌、Airbnb、Lyft、Dropbox,我发现这是真的。在大多数情况下,你可以通过谈判获得更多的薪水,而且你薪水的某些方面比其他方面更容易谈判。有了多个报价在手,我可以从每家公司协商出一个更好的报价。
## 谈判服务[](#negotiation-services "Direct link to heading")
如果你没有谈判过你过去的报价,或者是谈判游戏的新手,不要担心!有多种谈判服务可以帮助你。一般来说,它们是物有所值的。如果我以前知道谈判服务,我会利用它们!
### Rora [​](#rora "Direct link to heading")
Rora 的工作方式是,在整个薪资谈判过程中,你将得到他们经验丰富的专业团队的指导。它也是无风险的,因为你不必支付任何费用,除非你有一个增加的报价。在报价过程中获得 Rora 的帮助是一个不需要动脑筋的决定——有所增加总比没有增加好。不要把钱留在桌子上!看看[罗拉](https://www.teamrora.com/?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation)
Rora 可以为您做的事情:
* 即使没有竞争性报价,也能帮助你协商提价
* 通过他们对许多公司薪酬范围的了解,提供量身定制的建议
* 为您提供定制的脚本,告诉您在各种场景下与招聘人员谈论什么以及如何交谈
* 模拟谈判服务帮助你练习
* 在招聘人员通过聊天打电话的过程中为您提供实时指导
* 把你介绍给其他公司的招聘人员
[Book a free consultation with Rora  →](https://www.teamrora.com/?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation)
### Levels.fyi[](#levelsfyi "Direct link to heading")
Levels.fyi 最出名的是它是一个薪资数据库,但它们也提供补充服务,比如薪资谈判,在这个过程中,你将与有经验的招聘人员取得联系,为你提供帮助。Levels.fyi 与 Rora 的不同之处在于,Levels.fyi 收取固定费用,而 Rora 收取协商差额的百分比。
Expert tip
获得更多报酬。接收 [**Rora**](https://www.teamrora.com/?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation) (无风险)[**Levels.fyi**](https://www.levels.fyi/services/?ref=TechInterviewHandbook&utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation) 及其经验丰富的招聘人员团队的薪资谈判建议。不要把钱留在桌子上💰!
## 谈判课程[](#negotiation-courses "Direct link to heading")
如果你不热衷于为谈判服务付费,并且是课程的爱好者,这里有一些东西适合你——[Grokking Comp Negotiation in Tech](https://www.educative.io/courses/grokking-comp-negotiation?aff=x23W)课程,这是一门基于文本的课程,在这里你可以获得谈判各个方面的信息。**免责声明:我以前没有尝试过这个课程。**
</header>
\ No newline at end of file
# 谈判的十大规则
> 原文:[https://www.techinterviewhandbook.org/negotiation-rules/](https://www.techinterviewhandbook.org/negotiation-rules/)
<header>
节选自 Haseeb Qureshi 的《谈判工作机会的十条规则》第一部分和第二部分的要点。
## 把一切都写下来[](#get-everything-in-writing "Direct link to heading")
记下你和招聘人员电话中的所有内容,因为他们以后可能会有所帮助。即使有些事情与金钱没有直接关系,如果与工作有关,也要写下来。如果他们告诉你“我们正在努力将前端移植到 Angular”,请记下这一点。如果他们说他们有 20 名员工,写下来。你想要尽可能多的信息。你会忘记很多这方面的东西,而这对你的最终决定很重要。
## 始终保持门开着[](#always-keep-the-door-open "Direct link to heading")
在你完全准备好做出明智的、深思熟虑的最终决定之前,永远不要放弃你的谈判能力。这意味着你的工作是在不放弃继续谈判的权力的情况下,尽可能多地遍历这些决策点。很多时候,你的对话者会试图欺骗你做出决定,或者把你和你没有承诺的决定联系起来。在你真正准备好做最后的决定之前,你必须在口头上避免这些滑稽动作。
## 信息就是力量[](#information-is-power "Direct link to heading")
为了保护你在谈判中的权力,你必须尽可能地保护信息。这条规则的一个推论是,你不应该向公司透露你目前在做什么。因此,考虑到这个提议,不要要求更多的钱或股权或任何类似的东西。除了澄清之外,不要评论该提议的任何具体细节。公司会在这个过程的不同阶段询问你目前的薪酬——有些是在面试你之前,有些是在决定给你一份工作之后。但是请记住这一点,并保护信息。
> “是啊,【公司名称】听起来不错!我真的认为这很合适,我很高兴你们同意。现在我正在和其他几家公司谈判,所以在我完成这个过程并接近做出决定之前,我不能谈论这个提议的具体细节。但是我确信我们能够找到一个我们都满意的方案,因为我真的很想成为车队的一员。”
## [永远是正的](#always-be-positive "Direct link to heading")
即使工作机会很糟糕,对公司保持积极和兴奋也是非常重要的。这是因为你的兴奋是你在谈判中最有价值的资产之一。
不管谈判中发生了什么,给公司留下这样的印象:1)你仍然喜欢这家公司,2)你仍然很乐意在那里工作,即使数字、金钱或时间都不合适。一般来说,表明这一点的最有说服力的事情是重申你热爱这个任务、团队或他们正在解决的问题,并且真的希望看到事情得到解决。
## 不要做决策者[](#dont-be-the-decision-maker "Direct link to heading")
即使你并不特别在意你的朋友/家人/丈夫/母亲的想法,通过提及他们,你不再是招聘人员唯一需要争取的人。他们试图恐吓你是没有意义的;“真正的决策者”超出了他们的能力范围。这是客户支持和补救中的经典技巧。从来都不是打电话的人的错,他们只是一些可怜的笨蛋在做他们的工作。这不是他们能决定的。这有助于缓和紧张局势,让他们更好地控制局势。
> 我会查看其中一些细节,并与我的【家人/密友/重要的其他人】讨论。如果我有任何问题,我会联系你。非常感谢你和我分享这个好消息,我会和你保持联系的!
如果他们不是最终的决策者,就很难给他们施加压力。所以好好利用这一点。
## 有替代品[](#have-alternatives "Direct link to heading")
如果你已经在和其他公司接洽了(如果你做得对,就应该这样),你应该主动伸出手,让他们知道你刚刚收到了一份工作邀请。试着建立一种紧迫感。不管你是否知道截止日期,所有的优惠都会在某个时候过期,所以好好利用这一点。
> 你好【人物】,
>
> 我只是想告诉你我的最新进展。我刚刚收到来自【公司】的报价,这个报价相当高。也就是说,我真的对【你的神奇公司】感到兴奋,真的很想看看我们是否能成功。由于我的时间表现在被压缩了,你能做些什么来加快这个过程吗?
你应该特别提到给你工作机会的公司吗?看情况。如果是知名公司或者竞争对手,那肯定要提。如果这是一家不知名或不性感的公司,你应该只说你收到了一份工作邀请。如果它即将到期,你也应该提到这一点。
无论哪种方式,给你正在洽谈的每一家公司发一封这样的信。无论你认为你的申请是多么无望或毫无意义,你都想把这个信号传递给市场上所有考虑你的人。
公司在乎你是否收到了其他邀请。他们在意是因为每个公司都知道自己的流程有噪音,其他大部分公司的流程也有噪音。但是一个候选人有多个提议意味着他们有多个对他们有利的微弱信号。结合起来,这些汇聚成一个比任何单一的采访更强的信号。这就像知道一个学生有很强的 SAT 成绩,和 GPA,获得了各种奖学金。当然,他们仍有可能是个笨蛋,但这很难成为事实。
这并不是说公司会对这些信号做出相应的反应,也不是说他们不会高估资质和品牌。确实如此。但是关心你是否有其他的工作机会,并据此对你进行评估是完全理性的。
告诉其他公司你已经收到了邀请。给他们更多的信号,让他们知道你是一个有价值和有吸引力的候选人。理解为什么这会改变他们是否面试你的想法。
你的目标应该是让尽可能多的报价同时重叠。这将最大化你的谈判窗口。
有一个强有力的 BATNA(谈判协议的最佳替代方案)并进行沟通。
> 我收到了来自【其他公司】的另一份工作邀请,薪水非常诱人,但我真的很喜欢【贵公司】的使命,我认为它总体上更适合我。
> 我也在考虑重返研究生院,攻读后现代服饰学的硕士学位。虽然我对【贵公司】很兴奋,也很想加入这个团队,但如果我要放弃讽刺性的制帽生活,这个方案必须有意义。
## 宣告一切的理由[](#proclaim-reasons-for-everything "Direct link to heading")
对你自己和你的谈判伙伴来说,这都是一种脑残。仅仅陈述一个理由(任何理由)就能让你的要求感觉到人性和重要。不是你贪心,是你努力完成目标。
你的理由越不可反对,越有同情心,就越好。如果是医疗费用,或者偿还学生贷款,或者照顾家庭,你会让他们热泪盈眶。
顺其自然,为每件事陈述一个理由,你会发现招聘者更愿意成为你的拥护者。
## 不仅仅是为了钱[](#be-motivated-by-more-than-just-money "Direct link to heading")
当然,你也应该受到金钱的激励,但它应该是你优化的众多维度之一。你接受了多少培训,你的第一个项目是什么,你加入了哪个团队,甚至你的导师是谁——这些都是你可以也应该协商的事情。
当然,要想谈判成功,你需要了解对方的偏好。你想让交易对双方都有利。
## 了解他们看重什么[](#understand-what-they-value "Direct link to heading")
记住,只要你继续在公司工作,你总是可以加薪的,但只有一点你可以获得签约奖金。
公司最容易给予的是股票(如果公司提供股票的话)。公司喜欢赠送股票,因为这是你对公司的投资,也符合利益。这也将公司的部分风险转移给了你,并减少了资金消耗。
## 可赢[](#be-winnable "Direct link to heading")
这不仅仅是给公司留下你喜欢他们的印象(你应该继续这样做)。但更重要的是,你必须给任何一家与你谈判的公司一条如何赢得你的清晰道路。不要胡说八道或玩愚蠢的游戏。明确你的喜好和时间表。
不要浪费他们的时间,也不要为了自己的目的玩游戏。即使这家公司不是你梦想中的公司,你也必须能够想象出至少他们能提供给你一些让你签字的条件。如果没有,礼貌地拒绝他们。
Expert tip
获得更多报酬。接受 [**Rora**](https://www.teamrora.com/?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation) (无风险)[**Levels.fyi**](https://www.levels.fyi/services/?ref=TechInterviewHandbook&utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_negotiation) 及其经验丰富的招聘人员团队的薪资谈判帮助。不要把钱留在桌子上💰!
</header>
\ No newline at end of file
# 在公司之间选择
> 原文:[https://www . techinterviewphandbook . org/chopping-between-companies/](https://www.techinterviewhandbook.org/choosing-between-companies/)
<header>
如果你已经通过了面试并收到了多份工作邀请,那么恭喜你!现在你面临着另一个问题(虽然是一个好问题!)的选择。在这里,我们将为你在决定加入哪家公司时应该考虑的因素提供一些见解。每个人都是不同的,某些因素对其他人来说或多或少很重要,所以只有你自己才能决定什么是最适合你的。
做你的尽职调查,研究这些公司,然后再做决定!
## 补偿[](#compensation "Direct link to heading")
首先也是最重要的,赔偿。科技公司的大多数技术职位将获得类似的报酬——基本工资、奖金、股票和签约金。[了解薪酬](/understanding-compensation/)一节更详细。一些公司在报价上更加灵活,允许应聘者在更高的底薪和更高的股票之间做出选择。基本工资是最容易理解的,不管公司表现如何,你的工资都是一样的。奖金通常也是基本工资的一个百分比,所以高基本工资对规避风险的人来说很好。
并非所有的股票奖励都是平等的。一些公司有线性的授权周期(你每年授权相同的金额),一些公司如亚马逊和 Snap 有后装计划(你在早些年授权较少,在晚些年授权较多),还有注意悬崖。 [Stripe 和 Lyft](https://www.theinformation.com/articles/stripe-and-lyft-speed-up-equity-payouts-to-first-year) 最近改变了他们的股票结构,并宣布他们将加快第一年的股权支付。起初这听起来不错,[,但实际上有一些细微差别](https://tanay.substack.com/p/employee-compensation-and-one-year)
不管是哪家公司,**都要协商**你的报价,尤其是当你有多个报价可供选择的时候!手里有多个报价是你谈判的最佳筹码,你应该利用它。我们将在[谈判](/negotiation/)部分对此进行深入探讨。使用 [Rora](https://www.teamrora.com/?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_choosing_between_companies) 进行无风险谈判服务。
## 产品[](#products "Direct link to heading")
公司在做什么,公司在做你感兴趣的领域吗?大多数大型科技公司都有开发各种产品的团队。对于这些大型科技公司来说,常见的产品包括广告网络、聊天、企业产品、视频观看、支付、硬件产品、行业领先的 AI 工具、内部工具等。微软、亚马逊、苹果和字节跳动也有这些领域的产品。对于许多大公司来说,他们足够大,以至于他们为他们使用的大多数技术构建自己的基础架构和内部工具,因为市场上现有的大多数技术都无法满足他们的规模。
也就是说,每家科技公司都因某些东西而独树一帜,这是它们的基因。因此,如果你对特定的领域感兴趣,并且你确信你能够在这些领域工作,那么选择应该更明确:
* meta/脸书——社交网络(脸书、Instagram)、聊天(WhatsApp、Messenger)、元宇宙 stuff (Oculus)
* 谷歌搜索、浏览器(谷歌浏览器)、谷歌地图、云基础设施(谷歌云平台)、企业协作(谷歌套件)
* 亚马逊云基础设施(亚马逊网络服务),电子商务
* 微软-操作系统,微软办公套件
* 苹果-硬件、操作系统、服务(iCloud、Apple Music)
就我个人而言,如果我从事的产品也是我作为外部用户使用的,我会感觉更有动力和效率,因为我从用户的角度对产品有更好的理解,这可能会导致更好的工程和产品决策。
### 准团队[](#prospective-teams "Direct link to heading")
虽然一个公司可以开发各种产品,但有些产品只能在特定的办公室开发。例如,谷歌新加坡主要从事支付业务,如果你只对搜索感兴趣,谷歌新加坡就不太适合你,尽管将来有可能搬到另一个国家,但仍然是谷歌的员工。更多信息请参见下面的[调动和流动性](#transfers-and-mobility)部分。
一定要弄清楚你想去的地方从事什么产品和团队的工作,这样你就能更好地了解如果你加入那家公司,你的潜在工作生活会是什么样子。
## 公司前景[](#company-prospects "Direct link to heading")
如果你被授予股票,公司的前景会影响你的薪酬!该公司在未来几年是否会取得成功,或者是否有阻碍公司发展的因素?
## 职业成长[](#career-growth "Direct link to heading")
公司提拔员工的速度有多快,公司有没有给员工提供成长的机会?在小公司里,你会身兼数职,从 0 到 1 开发许多产品。对于喜欢提高产品构建技能和快速推出产品的人来说,这是非常棒的。然而,由于公司对产品工作的关注,而不是对通常只在规模上需要的基础设施建设的关注,技术增长可能是有限的。在一个只有 10 个人的小初创公司里,每个人都在争先恐后地开发产品,几乎不需要首席工程师。职业发展可能会受到公司及其产品的规模和范围的限制。
一些公司比其他公司更快地提升他们的员工。有句话叫去 Google 休息马甲,想加速职业生涯就去 Meta。根据我的经历和我在谷歌的同行,我发现这是非常准确的。在 Meta,工程师被要求在 2 年内从 E3 调到 E4,在 3 年内从 E4 调到 E5。另一方面,谷歌的晋升周期较慢——谷歌的普通工程师从 L3 到 L4 需要 2 年以上,从 L4 到 L5 需要 3 年以上,从 L5 到 L6 需要 4 年以上。在谷歌,终端级别是 L4,所以没有晋升的压力。我的同事中没有一个是谷歌的 L6,但有几个已经是 Meta 的 E6,这是完全可以实现的。在我看来,谷歌是一个学习成为优秀工程师的好地方。他们要求一切都是精心设计的,有设计文档和高测试覆盖率。对于那些不介意更加努力工作以加快职业道路的职业驱动型人士来说,Meta 是一个很好的地方。
## 公司文化[](#company-culture "Direct link to heading")
公司文化是指公司领导层及其员工的信念和行为。科技巨头以其独特的文化而闻名:
* 谷歌候选人在面试时会被评估他们的“谷歌性”因素,这是谷歌员工应该体现的一系列特质——“做正确的事情”、“追求卓越”、“适应模糊”。如上所述,谷歌以高度重视工程质量和数据驱动的决策方法而闻名。
* 梅塔/脸书-在脸书早期,他们的内部座右铭是“快速行动,打破东西”,表明他们专注于快速运输产品。2014 年,马克·扎克伯格(Mark Zuckerberg)将其改为“凭借稳定的基础设施快速前进”,因为该平台已经成熟,稳定性应该成为重点。我在博客文章中写了更多关于[梅塔/脸书文化的内容。](https://www.techinterviewhandbook.org/blog/my-experience-working-as-a-meta-facebook-engineer/#culture)
* 网飞-网飞的文化平台在他们的网站上公开,他们的核心理念是“T2 人超越过程”。他们喜欢认为自己是职业运动队——保留明星球员,让表现出色的球员离开,而不是像一个家庭一样运作——容忍不良行为,并表现出无条件的爱
### 工程文化[](#engineering-culture "Direct link to heading")
由于大多数读者都是技术人员,所以一家公司的技术文化值得特别一提。
Gergely Orosz 提出了 [12 点](https://blog.pragmaticengineer.com/pragmatic-engineer-test/)来评估一家科技公司是否有健康的软件工程文化
1. **股权或利润分享** -员工是否获得股权?
2. 工程师贡献的路线图/待办事项 -工程师对他们团队的路线图有贡献吗?
3. **工程师直接与其他 IC 合作** -工程师是否直接与其他角色(设计师、项目经理、数据科学家等)合作?
4. 代码评审和测试 -工程师经常检查代码并编写测试吗?
5. CI 和工程师推动生产 -有持续集成或工程师部署到生产的方法吗?
6. **内部开源** -工程师可以访问并贡献整个公司的代码库吗?
7. **优先考虑健康的 on call**-on call 负载是否可管理?
8. **技术经理** -工程经理是否具备技术背景和技能?
9. **职业阶梯(当超过 10 名工程师时)** -职业阶梯和每个级别的期望是否定义明确?
10. **平行集成电路&经理跟踪(当超过 30 名工程师时)** -一个人可以作为集成电路在职业阶梯上上升吗?
11. **反馈文化**——向对方/公司反馈是惯例吗?
12. **投资职业发展** -职业发展津贴,导师计划
FAANG 公司全取 12 分并不奇怪。在他的博客文章上了解更多信息。
哪家公司的文化最让你产生共鸣?
## 工作生活平衡[](#work-life-balance "Direct link to heading")
虽然通常的做法是员工每周工作 40 小时,每天工作 8 小时,但一些地方因压力更大而臭名昭著,并要求员工提供更多时间。一些著名的中国公司要求员工每周工作 6 天。大多数技术员工加班时没有工资,所以有时候计算你的工资更准确的方法是每小时的美元数,而不是原始的年度总薪酬
谷歌是一家以行动缓慢而闻名的公司,是人们休息和归属(股票)的地方,而亚马逊在员工调查中的工作生活平衡得分为 C。
## 转移和流动[](#transfers-and-mobility "Direct link to heading")
公司在全球各地有办公室吗?员工可以搬到那里吗?对于只有一个总部的小公司来说,这显然是不可能的,但有些公司允许员工远程办公,有些甚至完全远程办公!Meta、Google、Apple 和 Stripe 都是拥有全球业务和地区总部的公司。在 Meta 和 Google,流动性非常高,因为我们在伦敦、特拉维夫以及最近在新加坡都有大型工程办公室。我在 Meta 的一位经理已经在四个办公室工作过了!就我个人而言,就在 COVID hit 之前,我从 Meta/脸书门洛帕克搬到了 Meta/脸书新加坡,我的一些 Meta/谷歌朋友也做了类似的搬迁,有些人甚至从新加坡搬到了美国。
</header>
\ No newline at end of file
# 算法研究备忘单
\ No newline at end of file
# 数据结构和算法研究编码面试备忘单
> 原文:[https://www . techinterviewphandbook . org/algorithms/study-cheat sheet/](https://www.techinterviewhandbook.org/algorithms/study-cheatsheet/)
<header>
## 这个[是什么](#what-is-this "Direct link to heading")
这一节深入探讨算法面试中经常出现的算法和数据结构的实用知识和技术。你掌握的技巧越多,通过面试的几率就越高。他们可能会引导你发现你可能错过的角落案例,甚至引导你找到最佳方法!
## 每个学习指南的内容[](#contents-of-each-study-guide "Direct link to heading")
对于每个主题,您可以找到:
1. 简要概述
2. 学习资源
3. 要使用的特定于语言的库
4. 时间复杂性备忘单
5. 面试时要注意的事情
6. 角落案例
7. 有用的技巧和建议练习的问题
## 学习指南列表[](#study-guides-list "Direct link to heading")
下面是你应该为编码面试准备的数据结构和算法列表,以及相应的学习指南:
| 主题 | 优先 |
| --- | --- |
| [数组](/algorithms/array/) | 高的 |
| [字符串](/algorithms/string/) | 高的 |
| [哈希表](/algorithms/hash-table/) | 中间的 |
| [递归](/algorithms/recursion/) | 中间的 |
| [分类和搜索](/algorithms/sorting-searching/) | 高的 |
| [矩阵](/algorithms/matrix/) | 高的 |
| [链表](/algorithms/linked-list/) | 中间的 |
| [队列](/algorithms/queue/) | 中间的 |
| [堆栈](/algorithms/stack/) | 中间的 |
| [](/algorithms/tree/) | 高的 |
| [图形](/algorithms/graph/) | 高的 |
| [](/algorithms/heap/) | 中间的 |
| 排序 | 中间的 |
| [间隔](/algorithms/interval/) | 中间的 |
| [动态编程](/algorithms/dynamic-programming/) | 低的 |
| [二进制](/algorithms/binary/) | 低的 |
| [数学](/algorithms/math/) | 低的 |
| [几何形状](/algorithms/geometry/) | 低的 |
## 一般面试技巧[](#general-interview-tips "Direct link to heading")
澄清你潜意识里的任何假设。许多问题被有意地低估了。
总是首先验证输入。检查无效/空/负/不同类型的输入。永远不要假设您得到了有效的参数。或者,向面试官澄清你是否可以假设有效的输入(通常是),这样可以节省你编写输入验证代码的时间。
是否有任何时间/空间复杂性要求/限制?
检查一个接一个的错误。
在没有自动类型强制的语言中,检查值的串联是否属于同一类型:`int` / `str` / `list`
完成代码后,使用一些示例输入来测试您的解决方案。
该算法是否意味着要多次运行,例如在 web 服务器中?如果是,输入可能需要预处理,以提高每次调用的效率。
混合使用函数式和命令式编程范例:
* 尽可能写纯函数。
* 纯函数更容易推理,有助于减少实现中的错误。
* 避免改变传递到函数中的参数,特别是如果它们是通过引用传递的,除非你确定你在做什么。
* 然而,函数式编程通常在空间复杂度方面是昂贵的,因为非突变和新对象的重复分配。另一方面,命令式代码更快,因为您操作的是现有对象。因此,您需要通过在适当的地方使用适量的功能性和命令性代码来实现准确性和效率之间的平衡。
* 避免依赖和改变全局变量。全局变量引入了状态。
* 如果你必须依赖全局变量,确保你不会意外地改变它。
一般来说,要提高一个程序的速度,我们可以:(1)选择更合适的数据结构/算法;或者(2)使用更多的内存。后者展示了一个经典的空间与时间的权衡,但不一定是以牺牲空间为代价才能获得更快的速度。另外,请注意,您的程序运行速度通常有一个理论上的限制(就时间复杂性而言)。例如,一个要求你在一个未排序的数组中寻找最小/最大元素的问题的运行速度不能超过 O(N)。
数据结构是你的武器。为正确的战斗选择正确的武器是胜利的关键。非常熟悉每种数据结构的优势及其各种操作的时间复杂性。
可以扩充数据结构,以实现跨不同操作的高效时间复杂性。例如,哈希映射可以与双向链表一起使用,以实现在 [LRU 缓存](https://leetcode.com/problems/lru-cache/)中的`get``put`操作的 O(1)时间复杂度。
哈希表可能是算法问题最常用的数据结构。如果你被困在一个问题上,你的最后一招可能是列举常见的可能的数据结构(幸好没有那么多),并考虑是否每一个都适用于这个问题。这有时对我有用。
如果你在代码中偷工减料,大声告诉你的面试官,并告诉他在非面试环境下你会怎么做(没有时间限制)。例如,我会编写一个正则表达式来解析这个字符串,而不是使用`split()`,因为它可能无法涵盖所有情况。
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 基础
\ No newline at end of file
# 用于编码面试的数组备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/array/](https://www.techinterviewhandbook.org/algorithms/array/)
<header>
## 简介[](#introduction "Direct link to heading")
数组在连续的内存位置保存相同类型的值。在数组中,我们通常关心两件事——元素的位置/索引和元素本身。不同的编程语言以不同的方式实现数组,并且会影响对数组进行操作的时间复杂度。在 Python、JavaScript、Ruby、PHP 等语言中,数组(或 Python 中的 list)的大小是动态的,创建数组时不需要预先定义大小。因此,人们通常更容易在面试中使用这些语言。
数组是面试中最常见的数据结构。询问其他主题的问题也可能涉及数组/序列。掌握阵法对于面试来说至关重要!
**优势**
* 用一个变量名存储多个相同类型的元素
* 只要有索引,访问元素就很快,而不是像[链表](/algorithms/linked-list/)那样从头开始遍历。
**缺点**
* 向数组中间添加元素或从数组中间移除元素很慢,因为需要移动剩余的元素来容纳新的/缺失的元素。一个例外是,如果要插入/移除的位置在数组的末尾。
* 对于某些固定数组大小的语言,它在初始化后不能改变其大小。如果插入操作导致元素总数超过大小,则必须分配一个新的数组,并复制现有的元素。创建一个新数组并传递元素的行为需要 O(n)时间。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [数据结构中的数组:什么是数组运算](https://www.guru99.com/array-data-structure.html),Guru99
* 录像
* [阵列](https://www.coursera.org/lecture/data-structures/arrays-OsBSF),加州大学圣地亚哥分校
## 常用术语[](#common-terms "Direct link to heading")
在处理涉及数组的问题时,您会看到一些常见术语:
* 子数组-数组中连续值的范围。
* 例如:给定一个数组`[2, 3, 6, 1, 5, 4]``[3, 6, 1]`是一个子数组,而`[3, 1, 5]`不是子数组。
* 子序列——通过删除一些元素或不删除任何元素,而不改变剩余元素的顺序,可以从给定序列中导出的序列。
* 例如:给定一个数组`[2, 3, 6, 1, 5, 4]``[3, 1, 5]`是一个子序列,但是`[3, 5, 1]`不是一个子序列。
## 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O | 注意 |
| --- | --- | --- |
| 接近 | O(1) | |
| 搜索 | O(n) | |
| 搜索(排序数组) | O(log(n)) | |
| 插入 | O(n) | 插入需要将所有后续元素向右移动一位,这需要 O(n) |
| 插入(在末尾) | O(1) | 不需要移动其他元素的特殊插入情况 |
| 去除 | O(n) | 移除需要将所有后续元素左移一位,这需要 O(n) |
| 移除(在最后) | O(1) | 不需要移动其他元素的特殊移除情况 |
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
* 澄清数组中是否有重复值。重复值的存在会影响答案吗?它使问题更简单还是更难?
* 当使用索引迭代数组元素时,注意不要越界。
* 请注意在代码中分割或连接数组。通常,分割和连接数组需要 O(n)时间。在可能的情况下,使用开始和结束索引来划分子数组/范围。
## 拐角情况[](#corner-cases "Direct link to heading")
* 空序列
* 具有 1 或 2 个元素的序列
* 具有重复元素的序列
* 序列中的重复值
## 技巧[](#techniques "Direct link to heading")
注意,因为数组和字符串都是序列(字符串是字符数组),所以这里的大多数技术都适用于字符串问题。
### 滑动窗口[](#sliding-window "Direct link to heading")
掌握适用于许多子数组/子串问题的[滑动窗口技术](https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-problems)。在滑动窗口中,通常向同一方向移动的两个指针永远不会互相超越。这保证了每个值最多只被访问两次,时间复杂度仍然是 O(n)。例子:[无重复字符的最长子串](https://leetcode.com/problems/longest-substring-without-repeating-characters/)[最小尺寸子阵列总和](https://leetcode.com/problems/minimum-size-subarray-sum/)[最小窗口子串](https://leetcode.com/problems/minimum-window-substring/)
### 两个指针[](#two-pointers "Direct link to heading")
两个指针是滑动窗口的一个更一般的版本,指针可以互相交叉,可以在不同的数组上。例子:[排序颜色](https://leetcode.com/problems/sort-colors/)[回文子串](https://leetcode.com/problems/palindromic-substrings/)
当您有两个数组要处理时,通常每个数组有一个索引(指针)来遍历/比较这两个数组,相关时递增其中一个指针。例如,我们使用这种方法来合并两个排序后的数组。例子:[合并排序后的数组](https://leetcode.com/problems/merge-sorted-array/)
### 从右侧[穿越](#traversing-from-the-right "Direct link to heading")
有时你可以从右边开始遍历数组,而不是传统的从左边开始。例子:[每日气温](https://leetcode.com/problems/daily-temperatures/)[可见排队人数](https://leetcode.com/problems/number-of-visible-people-in-a-queue/)
### 排序数组[](#sorting-the-array "Direct link to heading")
数组是排序的还是部分排序的?如果是的话,某种形式的二分搜索法应该是可能的。这通常也意味着面试官在寻找比 O(n)更快的解决方案。
你能给数组排序吗?有时,首先对数组进行排序可能会大大简化问题。显然,如果需要保持数组元素的顺序,这是行不通的。例子:[合并间隔](https://leetcode.com/problems/merge-intervals/)[非重叠间隔](https://leetcode.com/problems/non-overlapping-intervals/)
### 预计算[](#precomputation "Direct link to heading")
对于涉及子阵列的求和或乘法的问题,使用散列或前缀/后缀和/积的预计算可能是有用的。例子:[除自身数组的乘积](https://leetcode.com/problems/product-of-array-except-self/)[最小子数组和](https://leetcode.com/problems/minimum-size-subarray-sum/)[LeetCode 问题标注“前缀-和”](https://leetcode.com/tag/prefix-sum/)
### 作为散列关键字的索引[](#index-as-a-hash-key "Direct link to heading")
如果给你一个序列,而面试官要求 O(1)空间,那么可以用这个数组本身作为哈希表。例如,如果数组只有从 1 到 N 的值,其中 N 是数组的长度,则对该索引处的值求反(减一)以指示该数字的存在。例子:[第一次不见正](https://leetcode.com/problems/first-missing-positive/)[每日气温](https://leetcode.com/problems/daily-temperatures/)
### 多次遍历数组[](#traversing-the-array-more-than-once "Direct link to heading")
这可能是显而易见的,但是遍历数组两次/三次(只要少于 n 次)仍然是 O(n)。有时多次遍历数组可以帮助您解决问题,同时保持时间复杂度为 O(n)。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [两笔总和](https://leetcode.com/problems/two-sum/)
* [买卖股票的最佳时机](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/)
* [除自身以外的数组乘积](https://leetcode.com/problems/product-of-array-except-self/)
* [最大子阵列](https://leetcode.com/problems/maximum-subarray/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [包含重复的](https://leetcode.com/problems/contains-duplicate/)
* [最大乘积子阵列](https://leetcode.com/problems/maximum-product-subarray/)
* [在旋转排序数组中搜索](https://leetcode.com/problems/search-in-rotated-sorted-array/)
* [3 总和](https://leetcode.com/problems/3sum/)
* [盛水最多的容器](https://leetcode.com/problems/container-with-most-water/)
* [滑动窗口最大值](https://leetcode.com/problems/sliding-window-maximum/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 用于编码面试的字符串 cheatsheet
> 原文:[https://www.techinterviewhandbook.org/algorithms/string/](https://www.techinterviewhandbook.org/algorithms/string/)
<header>
## 简介[](#introduction "Direct link to heading")
字符串是一系列字符。许多适用于数组的技巧也适用于字符串。建议您在阅读本页之前阅读关于[阵列](/algorithms/array/)的页面。
用于查找字符串的常见数据结构:
* [Trie/前缀树](https://en.wikipedia.org/wiki/Trie)
* [后缀树](https://en.wikipedia.org/wiki/Suffix_tree)
常见的字符串算法:
* [Rabin Karp](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm) 使用滚动散列高效搜索子串
* [KMP](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) 用于高效搜索子串
## 时间复杂度[](#time-complexity "Direct link to heading")
字符串是一个字符数组,因此基本字符串操作的时间复杂度与数组操作非常相似。
| 操作 | 大 O |
| --- | --- |
| 接近 | O(1) |
| 搜索 | O(n) |
| 插入 | O(n) |
| 去除 | O(n) |
### 涉及另一串[的操作](#operations-involving-another-string "Direct link to heading")
这里我们假设另一根弦的长度是 m。
| 操作 | 大 O | 注意 |
| --- | --- | --- |
| 查找子字符串 | o(牛米) | 这是最幼稚的情况。还有更有效的字符串搜索算法,如 [KMP 算法](https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm) |
| 串联字符串 | O(n + m) | |
| 薄片 | O(m) | |
| 拆分(按令牌) | O(n + m) | |
| 条带(删除前导和尾随空格) | O(n) | |
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
询问输入字符集和区分大小写。通常字符限于小写拉丁字符,例如 a 到 z。
## 拐角情况[](#corner-cases "Direct link to heading")
* 空字符串
* 包含 1 或 2 个字符的字符串
* 具有重复字符的字符串
* 只有不同字符的字符串
## 技巧[](#techniques "Direct link to heading")
许多字符串问题属于这些桶之一。
### 计数字符[](#counting-characters "Direct link to heading")
通常你需要计算字符串中字符的出现频率。最常见的方法是使用您选择的语言中的哈希表/映射。如果你的语言有一个内置的计数器类,比如 Python,问问你是否可以用它来代替。
如果需要保存一个字符的计数器,一个常见的错误就是说计数器需要的空间复杂度是 O(n)。一串拉丁字符的计数器所需的空间是 O(1)而不是 O(n)。这是因为上限是字符的范围,通常是 26 个固定常数。输入集只是小写拉丁字符。
#### 唯一字符串[](#string-of-unique-characters "Direct link to heading")
计算一串唯一字符中的字符数的一个巧妙方法是使用一个 26 位的位掩码来表示该字符串中有哪些小写拉丁字符。
```
mask = 0 for c in word: mask |= (1 << (ord(c) - ord('a')))
```
要确定两个字符串是否有共同的字符,对两个位掩码执行`&`。如果结果非零,即。`mask_a & mask_b > 0`,那么这两个字符串有共同的字符。
### 变位词[](#anagram "Direct link to heading")
变位词是单词转换或单词游戏。它是重新排列一个单词或短语的字母以产生一个新单词或短语的结果,而所有原始字母只使用一次。在面试中,通常我们只会被没有空格的单词困扰。
有几种方法可以确定两个字符串是否是变位词:
* 对两个字符串进行排序应该会产生相同的结果字符串。这需要 O(n.log(n))的时间和 O(log(n))的空间。
* 如果我们将每个字符映射到一个质数,并将每个映射的数相乘,字谜应该有相同的倍数(质因数分解)。这需要 O(n)时间和 O(1)空间。例子:[分组变位](https://leetcode.com/problems/group-anagrams/)
* 字符的频率计数将有助于确定两个字符串是否是字谜。这也需要 O(n)的时间和 O(1)的空间。
### 回文[](#palindrome "Direct link to heading")
回文是一个单词、短语、数字或其他向前和向后读起来一样的字符序列,例如`madam``racecar`
以下是判断字符串是否为回文的几种方法:
* 把字符串反过来,它应该等于它自己。
* 在字符串的开头和结尾有两个指针。向内移动指针,直到它们相遇。在每个时间点,两个指针上的字符都应该匹配。
字符串中字符的顺序很重要,所以哈希表通常没有帮助。
当一个问题是关于计算回文的数目时,一个常见的技巧是让两个指针向外移动,远离中间。注意回文长度可以是偶数也可以是奇数。对于每个中间枢纽位置,您需要检查两次——一次包含字符,一次不包含字符。这种技术用在最长的回文子串中。
* 对于子字符串,一旦没有匹配项,就可以提前终止
* 对于子问题,使用动态规划,因为有重叠的子问题。看看这个问题
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [有效的字谜](https://leetcode.com/problems/valid-anagram)
* [有效回文](https://leetcode.com/problems/valid-palindrome/)
* [没有重复字符的最长子串](https://leetcode.com/problems/longest-substring-without-repeating-characters/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [最长重复字符替换](https://leetcode.com/problems/longest-repeating-character-replacement/)
* [找出一个字符串中的所有变位词](https://leetcode.com/problems/find-all-anagrams-in-a-string)
* [最小窗口子串](https://leetcode.com/problems/minimum-window-substring/description/)
* [分组字谜](https://leetcode.com/problems/group-anagrams/)
* [最长回文子串](https://leetcode.com/problems/longest-palindromic-substring/)
* [编码和解码字符串(LeetCode Premium)](https://leetcode.com/problems/encode-and-decode-strings/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 用于编码面试的散列表清单
> 原文:[https://www . techinterviewphandbook . org/algorithms/hash-table/](https://www.techinterviewhandbook.org/algorithms/hash-table/)
<header>
## 简介[](#introduction "Direct link to heading")
哈希表(通常称为哈希映射)是一种实现关联数组抽象数据类型的数据结构,这种结构可以将键映射到值。哈希表使用元素上的哈希函数来计算桶或槽数组中的索引,也称为哈希代码,从中可以找到所需的值。在查找过程中,对键进行哈希运算,得到的哈希表示相应值的存储位置。
哈希是时空权衡最常见的例子。我们可以遍历数组一次,将所有元素散列到一个散列表中,而不是每次都线性搜索数组来确定元素是否存在,这需要 O(n)时间。确定元素是否存在是一个简单的问题,即散列元素并查看它是否存在于哈希表中,这平均为 O(1)。
在哈希冲突的情况下,有许多冲突解决技术可以使用。在面试中,你不太可能被问到冲突解决技术的细节:
* **独立链接** -每个值使用一个链表,这样它就存储了所有冲突的条目。
* **开放寻址** -所有条目记录都存储在桶数组本身中。当需要插入一个新条目时,将检查存储桶,从散列到的槽开始,按某种探测序列进行,直到找到一个未被占用的槽。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [从货架上取下散列表](https://medium.com/basecs/taking-hash-tables-off-the-shelf-139cbf4752f0),basecs
* [散列散列函数](https://medium.com/basecs/hashing-out-hash-functions-ea5dd8beb4dd),basecs
* 录像
* [核心:散列表](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP),加州大学圣地亚哥分校
## 实现[](#implementations "Direct link to heading")
| 语言 | 应用程序接口 |
| --- | --- |
| C++ | [T2`std::unordered_map`](https://docs.microsoft.com/en-us/cpp/standard-library/unordered-map) |
| Java 语言(一种计算机语言,尤用于创建网站) | [`java.util.Map`](https://docs.oracle.com/javase/10/docs/api/java/util/Map.html) 。使用 [`java.util.HashMap`](https://docs.oracle.com/javase/10/docs/api/java/util/HashMap.html)[`java.util.TreeMap`](https://docs.oracle.com/javase/10/docs/api/java/util/TreeMap.html) (首选) |
| 计算机编程语言 | [T2`dict`](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) |
| Java Script 语言 | [`Object`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)[`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) |
## 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O | 注意 |
| --- | --- | --- |
| 接近 | 不适用的 | 由于哈希码未知,无法访问 |
| 搜索 | o(1)* | |
| 插入 | o(1)* | |
| 去除 | o(1)* | |
** 这是平均情况,但是在采访中我们只关心哈希表的平均情况。*
## 样题[](#sample-questions "Direct link to heading")
* 描述一个最少使用的缓存的实现,以及它的 big-O 符号。
* 一个涉及 API 与 hash map 集成的问题,其中 hash map 的桶由链表组成。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [两笔总和](https://leetcode.com/problems/two-sum)
* [勒索信](https://leetcode.com/problems/ransom-note)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [分组字谜](https://leetcode.com/problems/group-anagrams/)
* [插入删除 GetRandom O(1)](https://leetcode.com/problems/insert-delete-getrandom-o1/)
* [第一次遗漏阳性](https://leetcode.com/problems/first-missing-positive/)
* [LRU 缓存](https://leetcode.com/problems/lru-cache/)
* [一个数据结构的全部](https://leetcode.com/problems/all-oone-data-structure/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的递归备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/recursion/](https://www.techinterviewhandbook.org/algorithms/recursion/)
<header>
## 简介[](#introduction "Direct link to heading")
递归是一种解决计算问题的方法,其解决方案依赖于同一问题的较小实例的解决方案。
所有递归函数都包含两个部分:
1. 定义了一个基本情况(或多个情况),它定义了递归何时停止——否则它将永远继续下去!
2. 将问题分解成更小的子问题,并调用递归调用
递归最常见的例子之一是斐波那契数列。
* 基本情况:`fib(0) = 0``fib(1) = 1`
* 递归关系:`fib(i) = fib(i-1) + fib(i-2)`
```
def fib(n): if n <= 1: return n return fib(n - 1) + fib(n - 2)
```
许多与编码面试相关的算法大量使用了递归——二分搜索法、合并排序、树遍历、深度优先搜索等。在本文中,我们关注的是使用递归但不属于其他众所周知的算法的问题。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [递归](https://www.cs.utah.edu/~germain/PPS/Topics/recursion.html),犹他大学
* 录像
* [尾部递归](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1),华盛顿大学
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
* 永远记住总是定义一个基本情况,这样你的递归就会结束。
* 递归对于排列很有用,因为它生成所有的组合和基于树的问题。你应该知道如何生成一个序列的所有排列,以及如何处理重复。
* 递归隐式使用堆栈。因此,所有的递归方法都可以使用堆栈进行迭代重写。当心递归层次太深导致堆栈溢出的情况(Python 中的默认限制是 1000)。向面试官指出这一点可能会给你加分。递归永远不会是 O(1)空间复杂度,因为涉及到堆栈,除非有[尾调用优化](https://stackoverflow.com/questions/310974/what-is-tail-call-optimization) (TCO)。了解您选择的语言是否支持 TCO。
* 基本案例的数量——在上面的斐波纳契例子中,注意我们的一个递归调用调用了`fib(n - 2)`。这表明您应该定义 2 个基本用例,以便您的代码覆盖输入范围内所有可能的函数调用。如果你的递归函数只调用了`fn(n - 1)`,那么只需要一个基本用例
## 拐角情况[](#corner-cases "Direct link to heading")
* `n = 0`
* `n = 1`
* 确保您有足够的基本案例来涵盖递归函数的所有可能调用
## 技巧[](#techniques "Direct link to heading")
### 记忆[](#memoization "Direct link to heading")
在某些情况下,您可能正在计算先前计算的输入的结果。让我们再来看看斐波那契的例子。`fib(5)`调用`fib(4)``fib(3)``fib(4)`调用`fib(3)``fib(2)``fib(3)`被叫了两次!如果`fib(3)`的值被记忆并再次使用,这大大提高了算法的效率,并且时间复杂度变为 O(n)。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [生成括号](https://leetcode.com/problems/generate-parentheses/)
* [组合](https://leetcode.com/problems/combinations/)
* [子集](https://leetcode.com/problems/subsets/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [电话号码的字母组合](https://leetcode.com/problems/letter-combinations-of-a-phone-number/)
* [子集二](https://leetcode.com/problems/subsets-ii/)
* [排列](https://leetcode.com/problems/permutations/)
* [数独求解器](https://leetcode.com/problems/sudoku-solver/)
* [频闪信号编号 II (LeetCode Premium)](https://leetcode.com/problems/strobogrammatic-number-ii/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 为面试编码排序和搜索备忘单
> 原文:[https://www . techinterviewphandbook . org/algorithms/sorting-searching/](https://www.techinterviewhandbook.org/algorithms/sorting-searching/)
<header>
## 简介[](#introduction "Direct link to heading")
排序是将序列中的元素按顺序重新排列的行为,可以是数字顺序或字典顺序,也可以是升序或降序。
一些基本算法运行在 O(n <sup>2</sup> )中,不应该在面试中使用。在算法面试中,你不太可能需要从头开始实现任何排序算法。相反,您需要使用语言的默认排序函数对输入进行排序,这样您就可以对它们使用二进制搜索。
在一个排序的元素数组上,通过利用它的排序属性,使用二分搜索法可以在比 O(n)更快的时间内完成搜索。二分搜索法将目标值与数组的中间元素进行比较,这将通知算法目标值是位于左半部分还是右半部分,并且对剩余的一半进行比较,直到找到目标或者剩余的一半为空。
## 学习资源[](#learning-resources "Direct link to heading")
虽然你不太可能在面试中被要求从头实现一个排序算法,但了解不同排序算法的各种时间复杂度是有好处的。
* 读物
* [整理排序算法背后的基础知识](https://medium.com/basecs/sorting-out-the-basics-behind-sorting-algorithms-b0a032873add),basecs
* [二分搜索法](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/),可汗学院
* 附加(仅当您有时间时)
* [指数简易选择排序](https://medium.com/basecs/exponentially-easy-selection-sort-d7a34292b049),basecs
* [冒泡与冒泡排序](https://medium.com/basecs/bubbling-up-with-bubble-sorts-3df5ac88e592),basecs
* [向插入排序](https://medium.com/basecs/inching-towards-insertion-sort-9799274430da)点动,basecs
* [理解合并排序(第一部分)](https://medium.com/basecs/making-sense-of-merge-sort-part-1-49649a143478),basecs
* [理解合并排序(第二部分)](https://medium.com/basecs/making-sense-of-merge-sort-part-2-be8706453209),basecs
* [旋转理解快速排序(第一部分)](https://medium.com/basecs/pivoting-to-understand-quicksort-part-1-75178dfb9313),basecs
* [旋转理解快速排序(第二部分)](https://medium.com/basecs/pivoting-to-understand-quicksort-part-2-30161aefe1d3),basecs
* [使用计数排序](https://medium.com/basecs/counting-linearly-with-counting-sort-cd8516ae09b3)进行线性计数,basecs
* [用基数排序](https://medium.com/basecs/getting-to-the-root-of-sorting-with-radix-sort-f8e9240d4224)得到排序的根,basecs
## 时间复杂度[](#time-complexity "Direct link to heading")
| 算法 | 时间 | 空间 |
| --- | --- | --- |
| 冒泡排序 | O(n <sup>2</sup> | O(1) |
| 插入排序 | O(n <sup>2</sup> | O(1) |
| 选择排序 | O(n <sup>2</sup> | O(1) |
| 快速分类 | o(国家和地区) | O(log(n)) |
| 合并分类 | o(国家和地区) | O(n) |
| 堆排序 | o(国家和地区) | O(1) |
| 计数排序 | O(n + k) | O(k) |
| 基数排序 | O(nk) | O(n + k) |
| 算法 | 大 O |
| --- | --- |
| 二进位检索 | O(log(n)) |
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
一定要知道语言默认排序算法的时间和空间复杂度!时间复杂度几乎肯定是 O(nlog(n))。如果你能说出这种分类,那就加分了。在 Python 中是 [Timsort](https://en.wikipedia.org/wiki/Timsort)
## 拐角情况[](#corner-cases "Direct link to heading")
* 空序列
* 单元素序列
* 双元素序列
* 包含重复元素的序列。
## 技巧[](#techniques "Direct link to heading")
### 排序后的输入[](#sorted-inputs "Direct link to heading")
当一个给定的序列是有序的(升序或降序),使用二分搜索法应该是你首先想到的事情之一。
### 对具有有限范围 [](#sorting-an-input-that-has-limited-range "Direct link to heading") 的输入进行排序
[计数排序](https://en.wikipedia.org/wiki/Counting_sort)是一种不基于比较的排序,您可以在预先知道值的范围的数字上使用。例子: [H 指数](https://leetcode.com/problems/h-index/)
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [二分搜索法](https://leetcode.com/problems/binary-search/)
* [在旋转排序数组中搜索](https://leetcode.com/problems/search-in-rotated-sorted-array/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [排序矩阵中的第 k 个最小元素](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/)
* [搜索 2D 矩阵](https://leetcode.com/problems/search-a-2d-matrix/)
* [数组中第 k 个最大的元素](https://leetcode.com/problems/kth-largest-element-in-an-array/)
* [在旋转排序数组中寻找最小值](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/)
* [两个排序数组的中值](https://leetcode.com/problems/median-of-two-sorted-arrays/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 数据结构
\ No newline at end of file
# 编码面试的矩阵备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/matrix/](https://www.techinterviewhandbook.org/algorithms/matrix/)
<header>
## 简介[](#introduction "Direct link to heading")
矩阵是一个二维数组。涉及矩阵的题通常与[动态规划](/algorithms/dynamic-programming/)[](/algorithms/graph/)遍历有关。
矩阵可以用来表示图形,其中每个节点是矩阵上的一个单元,它有 4 个邻居(除了边和角上的那些单元)。本页将集中在不使用矩阵作为图表的问题。旨在将矩阵用作图表的问题可在[图表部分](/algorithms/graph/)找到。
## 拐角情况[](#corner-cases "Direct link to heading")
* 空矩阵。检查所有数组的长度都不是 0
* 1 x 1 矩阵
* 只有一行或一列的矩阵
## 技巧[](#techniques "Direct link to heading")
### 创建一个空的 N×M 矩阵[](#creating-an-empty-n-x-m-matrix "Direct link to heading")
对于涉及遍历或动态编程的问题,您几乎总是希望复制一个具有相同大小/维数的矩阵,该矩阵被初始化为空值,以存储已访问的状态或动态编程表。在你选择的语言中熟悉这样一个惯例:
这可以在 Python 中用一行代码轻松完成。
```
# Assumes that the matrix is non-empty zero_matrix = [[0 for _ in range(len(matrix[0]))] for _ in range(len(matrix))]
```
在 Python 中复制矩阵是:
```
copied_matrix = [row[:] for row in matrix]
```
### 转置一个矩阵
矩阵的转置是通过将矩阵的行交换成列或者将列交换成行来实现的。
很多基于网格的游戏都可以建模成一个矩阵,比如井字游戏、数独、纵横字谜、Connect 4、战舰等。被要求验证游戏获胜条件的情况并不少见。对于像井字游戏、连接 4 和纵横字谜这样的游戏,验证必须垂直和水平进行,一个技巧是编写代码来验证水平单元的矩阵,转置矩阵,并重用水平验证的逻辑来验证最初的垂直单元(现在是水平的)。
在 Python 中转置矩阵很简单:
```
transposed_matrix = zip(*matrix)
```
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [设置矩阵零点](https://leetcode.com/problems/set-matrix-zeroes/)
* [螺旋矩阵](https://leetcode.com/problems/spiral-matrix/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [旋转图像](https://leetcode.com/problems/rotate-image/)
* [有效数独](https://leetcode.com/problems/valid-sudoku/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的链接列表备忘单
> 原文:[https://www . techinterviewphandbook . org/algorithms/linked-list/](https://www.techinterviewhandbook.org/algorithms/linked-list/)
<header>
## 简介[](#introduction "Direct link to heading")
像数组一样,链表也用来表示顺序数据。它是数据元素的线性集合,其顺序不是由它们在内存中的物理位置给出的,这与数组相反,数组中的数据存储在顺序的内存块中。相反,每个元素包含下一个元素的地址。它是一种数据结构,由共同代表一个序列的节点集合组成。
在最基本的形式中,每个节点包含:数据,以及对序列中下一个节点的引用(换句话说,链接)。
**优势**
在列表中插入和删除一个节点(给定它的位置)是 O(1),而在数组中,下面的元素必须移位。
**缺点**
访问时间是线性的,因为通过元素在列表中的位置直接访问元素是不可能的(例如,在数组中你可以做`arr[4]`)。你必须从头开始穿越。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* 到底什么是链表?【第一部分】,basecs
* 到底什么是链表?【第二部分】,basecs
* 录像
* [单链表](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK),加州大学圣地亚哥分校
* [双向链表](https://www.coursera.org/lecture/data-structures/doubly-linked-lists-jpGKD),加州大学圣地亚哥分校
## 链表的类型[](#types-of-linked-lists "Direct link to heading")
### 单链表[](#singly-linked-list "Direct link to heading")
一个链表,其中每个节点指向下一个节点,最后一个节点指向`null`
### 双向链表[](#doubly-linked-list "Direct link to heading")
一个链表,其中每个节点有两个指针,`next`指向下一个节点,`prev`指向前一个节点。第一个节点的`prev`指针和最后一个节点的`next`指针指向`null`
### 循环链表[](#circular-linked-list "Direct link to heading")
一个单链表,其中最后一个节点指向第一个节点。有一种循环双向链表变体,其中第一个节点的`prev`指针指向最后一个节点,最后一个节点的`next`指针指向第一个节点。
## 实现[](#implementations "Direct link to heading")
在通用语言中,只有 Java 提供了链表实现。谢天谢地,不管用什么语言,编写自己的链表都很容易。
| 语言 | 应用程序接口 |
| --- | --- |
| C++ | 不适用的 |
| Java 语言(一种计算机语言,尤用于创建网站) | [T2`java.util.LinkedList`](https://docs.oracle.com/javase/10/docs/api/java/util/LinkedList.html) |
| 计算机编程语言 | 不适用的 |
| Java Script 语言 | 不适用的 |
## 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O | 注意 |
| --- | --- | --- |
| 接近 | O(n) | |
| 搜索 | O(n) | |
| 插入 | O(1) | 假设您已经遍历到插入位置 |
| 去除 | O(1) | 假设您已经遍历到要删除的节点 |
## 常用套路[](#common-routines "Direct link to heading")
熟悉以下例程,因为许多链表问题在解决方案中使用了一个或多个这些例程:
* 计算链表中的节点数
* 就地反转链接列表
* 使用两个指针(快/慢)查找链表的中间节点
* 将两个链表合并在一起
## 拐角情况[](#corner-cases "Direct link to heading")
* 空链表(表头为`null`)
* 单一节点
* 两个音符
* 链表有循环。**提示:**事先和面试官明确,列表中是否可以有循环。通常答案是否定的,你不必在代码中处理它
## 技巧[](#techniques "Direct link to heading")
### 前哨/伪节点[](#sentineldummy-nodes "Direct link to heading")
在头部和/或尾部添加前哨/伪节点可能有助于处理必须在头部或尾部执行操作的许多边缘情况。虚拟节点的存在实质上确保了操作永远不会在头部或尾部完成,从而消除了编写条件检查来处理空指针时的许多麻烦。请务必记住在操作结束时将它们移除。
### 两个指针[](#two-pointers "Direct link to heading")
对于链表,两种指针方法也很常见。这种方法用于许多经典的链表问题。
* 从最后一个节点获取第 k 个节点——有两个指针,其中一个比另一个领先 k 个节点。当前面的节点到达终点时,另一个节点落后 k 个节点
* 检测周期——有两个指针,其中一个指针的增量是另一个指针的两倍,如果两个指针相遇,就意味着有周期
* 获取中间节点——有两个指针,其中一个指针的增量是另一个的两倍。当速度较快的节点到达列表末尾时,速度较慢的节点将位于中间
### 使用空格[](#using-space "Direct link to heading")
许多链表问题可以通过创建一个新的链表并向新的链表添加节点以及最终结果来轻松解决。然而,这占用了额外的空间,使得问题的挑战性大大降低。面试官通常会要求你就地修改链表,在没有额外存储的情况下解决问题。你可以借用[逆向链表](https://leetcode.com/problems/reverse-linked-list/)问题的思路。
### 优雅的修改操作[](#elegant-modification-operations "Direct link to heading")
如前所述,链表的非顺序内存特性允许有效地修改其内容。与只能修改某个位置的值的数组不同,对于链表,除了修改`value`之外,还可以修改`next`指针。
以下是一些常见操作以及如何轻松实现这些操作:
* 截断一个列表——将`next`指针设置为指向最后一个元素的`null`
* 交换节点的值——就像数组一样,只交换两个节点的值,不需要交换`next`指针
* 合并两个列表——将第二个列表的头部附加到第一个列表的尾部
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [反转链表](https://leetcode.com/problems/reverse-linked-list/)
* [检测链表中的循环](https://leetcode.com/problems/linked-list-cycle/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [合并两个排序列表](https://leetcode.com/problems/merge-two-sorted-lists/)
* [合并 K 个排序列表](https://leetcode.com/problems/merge-k-sorted-lists/)
* [从列表末尾删除第 n 个节点](https://leetcode.com/problems/remove-nth-node-from-end-of-list/)
* [重新排序列表](https://leetcode.com/problems/reorder-list/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 用于编码面试的队列备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/queue/](https://www.techinterviewhandbook.org/algorithms/queue/)
<header>
## 简介[](#introduction "Direct link to heading")
队列是在序列中维护的元素的线性集合,并且可以通过在序列的一端添加元素(**入队**操作)和从另一端移除元素(**出列**操作)来修改。通常,序列中添加元素的末端称为队列的后部,删除元素的末端称为队列的前部。作为一种抽象数据类型,队列可以使用数组或单链表来实现。
这种行为通常被称为 FIFO(先进先出)。这种类型的结构的名称“队列”来源于对现实生活中排队等待商品或服务的人们的类比。
广度优先搜索通常使用队列来实现。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [排队还是不排队](https://medium.com/basecs/to-queue-or-not-to-queue-2653bcde5b04),基本秒
* 录像
* [队列](https://www.coursera.org/lecture/data-structures/queues-EShpq),加州大学圣地亚哥分校
## 实现[](#implementations "Direct link to heading")
| 语言 | 应用程序接口 |
| --- | --- |
| C++ | [T2`std::queue`](https://docs.microsoft.com/en-us/cpp/standard-library/queue-class) |
| Java 语言(一种计算机语言,尤用于创建网站) | [`java.util.Queue`](https://docs.oracle.com/javase/10/docs/api/java/util/Queue.html) 。使用 [`java.util.ArrayDeque`](https://docs.oracle.com/javase/10/docs/api/java/util/ArrayDeque.html) |
| 计算机编程语言 | [T2`queue`](https://docs.python.org/3/library/queue.html) |
| Java Script 语言 | 不适用的 |
## 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O |
| --- | --- |
| 排队/出价 | O(1) |
| 出列/轮询 | O(1) |
| 前面 | O(1) |
| 背部 | O(1) |
| isEmpty | O(1) |
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
大多数语言没有可以使用的内置队列类,候选语言通常使用数组(JavaScript)或列表(Python)作为队列。但是,请注意,这种情况下的入队操作将是 O(n ),因为它需要将所有其他元素移位一位。在这种情况下,您可以向面试官指出这一点,并说您假设有一个队列数据结构可以使用,它具有高效的入队操作。
## 拐角情况[](#corner-cases "Direct link to heading")
* 空队列
* 有一个项目的队列
* 两个物品排队
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [使用队列实现堆栈](https://leetcode.com/problems/implement-stack-using-queues)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [使用堆栈实现队列](https://leetcode.com/problems/implement-queue-using-stacks)
* [设计循环队列](https://leetcode.com/problems/design-circular-queue)
* [设计点击计数器(LeetCode Premium)](https://leetcode.com/problems/design-hit-counter)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 用于编码面试的堆栈备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/stack/](https://www.techinterviewhandbook.org/algorithms/stack/)
<header>
## 简介[](#introduction "Direct link to heading")
堆栈是一种抽象数据类型,支持操作 **push** (在堆栈顶部插入新元素)和 **pop** (移除并返回最近添加的元素,即堆栈顶部的元素)。作为一种抽象数据类型,堆栈可以使用数组或单链表来实现。
这种行为通常被称为后进先出(LIFO)。这种类型的结构的名称“stack”来源于一组相互堆叠的物理项目的类比。
堆栈是支持嵌套或递归函数调用的一种重要方式,用于实现深度优先搜索。深度优先搜索可以使用递归或手动堆栈来实现。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [堆栈和溢出](https://medium.com/basecs/stacks-and-overflows-dbcf7854dc67),basecs
* 录像
* [书库](https://www.coursera.org/lecture/data-structures/stacks-UdKzQ),加州大学圣地亚哥分校
## 实现[](#implementations "Direct link to heading")
| 语言 | 应用程序接口 |
| --- | --- |
| C++ | [T2`std::stack`](https://docs.microsoft.com/en-us/cpp/standard-library/stack-class) |
| Java 语言(一种计算机语言,尤用于创建网站) | [T2`java.util.Stack`](https://docs.oracle.com/javase/10/docs/api/java/util/Stack.html) |
| 计算机编程语言 | 模拟使用[列表](https://docs.python.org/3/tutorial/datastructures.html) |
| Java Script 语言 | 使用[数组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)模拟 |
## 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O |
| --- | --- |
| 顶部/顶部 | O(1) |
| 推 | O(1) |
| 流行音乐 | O(1) |
| isEmpty | O(1) |
| 搜索 | O(n) |
## 拐角情况[](#corner-cases "Direct link to heading")
* 空栈。从空堆栈中弹出
* 与一个项目堆叠
* 堆叠两个项目
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [有效括号](https://leetcode.com/problems/valid-parentheses)
* [使用堆栈实现队列](https://leetcode.com/problems/implement-queue-using-stacks)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [使用队列实现堆栈](https://leetcode.com/problems/implement-queue-using-stacks)
* [最小堆栈](https://leetcode.com/problems/min-stack)
* [小行星碰撞](https://leetcode.com/problems/asteroid-collision)
* [评估反向波兰符号](https://leetcode.com/problems/evaluate-reverse-polish-notation)
* [基本计算器](https://leetcode.com/problems/basic-calculator)
* [基本计算器二](https://leetcode.com/problems/basic-calculator-ii)
* [每日气温](https://leetcode.com/problems/daily-temperatures)
* [收集雨水](https://leetcode.com/problems/trapping-rain-water)
* [直方图中最大的矩形](https://leetcode.com/problems/largest-rectangle-in-histogram)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的间隔备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/interval/](https://www.techinterviewhandbook.org/algorithms/interval/)
<header>
## 简介[](#introduction "Direct link to heading")
区间问题是[数组](/algorithms/array/)问题的一个子集,其中给你一个二元数组的数组(一个区间),两个值代表一个开始值和一个结束值。区间问题被认为是数组家族的一部分,但它们涉及一些常见的技术,因此它们被提取到自己的特殊部分。
一个区间数组的例子:`[[1, 2], [4, 7]]`
对于那些以前没有尝试过的人来说,区间问题可能很棘手,因为当它们重叠时,需要考虑的情况非常多。
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
* 向面试官澄清`[1, 2]``[2, 3]`是否被视为重叠区间,因为这会影响你如何填写你的平等检查。
* 明确`[a, b]`的间隔是否严格遵循`a` < `b` ( `a`小于`b`)
## 拐角情况[](#corner-cases "Direct link to heading")
* 没有间隔
* 单一区间
* 两个间隔
* 非重叠区间
* 在另一个时间间隔内完全消耗的时间间隔
* 重复的间隔(完全相同的开始和结束)
* 恰好在另一个区间结束处开始的区间- `[[1, 2], [2, 3]]`
## 技巧[](#techniques "Direct link to heading")
### 按起点 [](#sort-the-array-of-intervals-by-its-starting-point "Direct link to heading") 对区间数组进行排序
区间问题的一个常见例程是按照每个区间的起始值对区间数组进行排序。这一步对于解决[合并区间](https://leetcode.com/problems/merge-intervals/)问题至关重要。
### 检查两个区间是否重叠[](#checking-if-two-intervals-overlap "Direct link to heading")
熟悉编写代码检查两个区间是否重叠。
```
def is_overlap(a, b): return a[0] < b[1] and b[0] < a[1]
```
### 合并两个区间[](#merging-two-intervals "Direct link to heading")
```
def merge_overlapping_intervals(a, b): return [min(a[0], b[0]), max(a[1], b[1])]
```
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [合并间隔](https://leetcode.com/problems/merge-intervals/)
* [插入间隔](https://leetcode.com/problems/insert-interval/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [非重叠区间](https://leetcode.com/problems/non-overlapping-intervals/)
* [会议室(LeetCode Premium)](https://leetcode.com/problems/meeting-rooms/)
* [第二会议室(LeetCode Premium)](https://leetcode.com/problems/meeting-rooms-ii/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 高级数据结构
\ No newline at end of file
# 编码面试的树形清单
> 原文:[https://www.techinterviewhandbook.org/algorithms/tree/](https://www.techinterviewhandbook.org/algorithms/tree/)
<header>
## 简介[](#introduction "Direct link to heading")
树是一种广泛使用的抽象数据类型,它用一组相连的节点来表示分层结构。树中的每个节点可以连接到许多子节点,但必须连接到一个父节点,根节点除外,它没有父节点。
树是一种无向且连通的无环图。没有循环或回路。每个节点可以像它自己的子树的根节点一样,使得[递归](/algorithms/recursion/)成为一种有用的树遍历技术。
出于面试的目的,你通常会被问到二叉树,而不是三元(3 个孩子)或 N 元(N 个孩子)树。在这一页,我们将涵盖二叉树和二分搜索法树,这是二叉树的一个特例。
树通常用于表示分层数据,例如文件系统、JSON 和 HTML 文档。请务必查看关于 [Trie](/algorithms/trie/) 的部分,这是一种用于高效存储和搜索字符串的高级树。
## 学习资源[](#learning-resources "Direct link to heading")
* 录像
* [树木](https://www.coursera.org/lecture/data-structures/trees-95qda),加州大学圣地亚哥分校
* 读物
* [如何不被树难倒](https://medium.com/basecs/how-to-not-be-stumped-by-trees-5f36208f68a7),basecs
* 把它放到二叉树中
* 附加(仅当您有时间时)
* [小 AVL 树可以](https://medium.com/basecs/the-little-avl-tree-that-could-86a3cae410c7),basecs
* [忙于 B 树](https://medium.com/basecs/busying-oneself-with-b-trees-78bbf10522e7),basecs
* [用红黑树将节点涂成黑色](https://medium.com/basecs/painting-nodes-black-with-red-black-trees-60eacb2be9a5),basecs
## 你需要知道的常用术语[](#common-terms-you-need-to-know "Direct link to heading")
* **邻居** -节点的父节点或子节点
* **祖先** -通过遍历其父链可到达的节点
* **后代** -节点子树中的一个节点
* **度** -一个节点的子节点数
* **树的度**-树中节点的最大度
* **距离** -两个节点间最短路径的边数
* **级别/深度** -沿着节点和根节点之间的唯一路径的边的数量
* **宽度** -一个级别中的节点数
### 二叉树[](#binary-tree "Direct link to heading")
二进制意味着两个,所以二叉树中的节点最多有两个子节点。
**二叉树术语**
* 完全二叉树-完全二叉树是这样一种二叉树,其中除了可能的最后一层之外,每一层都被完全填充,并且最后一层中的所有节点都尽可能靠左。
* 平衡二叉树——一种二叉树结构,其中每个节点的左右子树的高度差不超过 1。
**遍历**
![Tree](../Images/5ab667d22f638f05fe8629443b764a70.png)
给定这样的树,这些是各种遍历的结果。
* **按序遍历** -左- >根- >右
* 结果:2,7,5,6,11,1,9,5,9
* **前序遍历** -根- >左- >右
* 结果:1,7,2,6,5,11,9,9,5
* **后序遍历** -左->-右- >根
* 结果:2,5,11,6,7,5,9,9,1
注意,二叉树的有序遍历不足以唯一地序列化一个树。还需要前序或后序遍历。
### 二叉查找树(英国夏令时)[](#binary-search-tree-bst "Direct link to heading")
对 BST 的有序遍历将使所有元素有序。
非常熟悉 BST 的属性,并验证二叉树是 BST。这个问题出现的频率比预期的要高。
当问题涉及 BST 时,面试官通常会寻找比 O(n)运行速度更快的解决方案。
#### 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O |
| --- | --- |
| 接近 | O(log(n)) |
| 搜索 | O(log(n)) |
| 插入 | O(log(n)) |
| 去除 | O(log(n)) |
遍历平衡树的空间复杂度是 O(h)其中 h 是树的高度,而遍历非常偏斜的树(本质上是一个链表)将是 O(n)。
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
您应该非常熟悉递归地编写前序、按序和后序遍历。作为扩展,通过迭代地编写它们来挑战自己。有时面试官会问候选人迭代方法,尤其是当候选人太快写完递归方法的时候。
## 拐角情况[](#corner-cases "Direct link to heading")
* 空树
* 单一节点
* 两个音符
* 非常倾斜的树(像一个链表)
## 常用套路[](#common-routines "Direct link to heading")
熟悉以下程序,因为许多树型问题在解决方案中使用了一个或多个这些程序:
* 插入值
* 删除值
* 计算树中节点的数量
* 值是否在树中
* 计算树的高度
* 二叉查找树
* 确定是否是二叉查找树
* 获取最大值
* 获取最小值
## 技巧[](#techniques "Direct link to heading")
### 使用递归[](#use-recursion "Direct link to heading")
递归是遍历树的最常见的方法。当您注意到子树问题可以用来解决整个问题时,请尝试使用递归。
当使用递归时,总是记得检查基本情况,通常是节点是`null`的地方。
有时你的递归函数可能需要返回两个值。
### 按级别[遍历](#traversing-by-level "Direct link to heading")
当你被要求逐层遍历一棵树时,使用广度优先搜索。
### 节点总和[](#summation-of-nodes "Direct link to heading")
如果问题涉及沿途节点的求和,一定要检查节点是否可以是负数。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* 二叉树
* [二叉树的最大深度](https://leetcode.com/problems/maximum-depth-of-binary-tree/)
* [反转/翻转二叉树](https://leetcode.com/problems/invert-binary-tree/)
* 二叉查找树
* [二叉查找树的最低共同祖先](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* 二叉树
* [同一棵树](https://leetcode.com/problems/same-tree/)
* [二叉树最大路径和](https://leetcode.com/problems/binary-tree-maximum-path-sum/)
* [二叉树层次顺序遍历](https://leetcode.com/problems/binary-tree-level-order-traversal/)
* [二叉树的最低共同祖先](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/)
* [二叉树右侧视图](https://leetcode.com/problems/binary-tree-right-side-view/)
* [另一棵树的子树](https://leetcode.com/problems/subtree-of-another-tree/)
* [根据前序和中序遍历构建二叉树](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)
* [序列化和反序列化二叉树](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/)
* 二叉查找树
* [验证二叉查找树](https://leetcode.com/problems/validate-binary-search-tree/)
* [BST 中的第 k 个最小元素](https://leetcode.com/problems/kth-smallest-element-in-a-bst/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 用于编码面试的图表备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/graph/](https://www.techinterviewhandbook.org/algorithms/graph/)
<header>
## 简介[](#introduction "Direct link to heading")
图是包含一组对象(节点或顶点)的结构,其中在这些节点/顶点之间可以有边。边可以是有向的或无向的,并且可以选择性地具有值(加权图)。树是无向图,其中任意两个顶点仅由一条边连接,并且图中不能有圈。
图形通常用于对无序实体之间的关系进行建模,例如
* 人与人之间的友谊——每个节点都是一个人,节点之间的边表示这两个人是朋友。
* 位置之间的距离-每个节点都是一个位置,节点之间的边表示这些位置是相连的。边的值代表距离。
熟悉各种图形表示、图形搜索算法及其时间和空间复杂性。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [从理论到实践:表示图](https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38),basecs
* [深入研究一个图形:DFS 遍历](https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13),basecs
* [在图中变宽:BFS 遍历](https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255),basecs
* 附加(仅当您有时间时)
* 在 Dijkstra 、basecs 的帮助下,寻找最短路径
* [用有向无环图](https://medium.com/basecs/spinning-around-in-cycles-with-directed-acyclic-graphs-a233496d4688)、basecs 循环打转
## 图形表示[](#graph-representations "Direct link to heading")
可以给你一个边的列表,你必须从这些边构建你自己的图,这样你就可以遍历它们。常见的图形表示有:
* 邻接矩阵
* 邻接表
* 哈希表中的哈希表
在算法面试中,使用哈希表中的哈希表是最简单的方法。在面试中,你很少不得不使用邻接矩阵或列表来解决图形问题。
在算法访谈中,通常在输入中以 2D 矩阵的形式给出图形,其中像元是节点,每个像元可以遍历其相邻像元(上/下/左/右)。因此,熟悉 2D 矩阵的遍历是很重要的。当遍历矩阵时,始终确保您的当前位置在矩阵的边界内,并且以前没有被访问过。
## 时间复杂度[](#time-complexity "Direct link to heading")
`|V|`是顶点的数量,而`|E|`是边的数量。
| 算法 | 大 O |
| --- | --- |
| 深度优先搜索 | o(&#124;V&#124;+&#124;E&#124;) |
| 广度优先搜索 | o(&#124;V&#124;+&#124;E&#124;) |
| 拓扑排序 | o(&#124;V&#124;+&#124;E&#124;) |
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
* 树形图很可能是一个允许循环的图,简单的递归解决方案是行不通的。在这种情况下,您必须处理循环,并在遍历时保留一组已访问的节点。
* 确保正确跟踪已访问的节点,并且每个节点不会被访问超过一次。否则,您的代码可能会陷入无限循环。
## 拐角情况[](#corner-cases "Direct link to heading")
* 空图
* 有一个或两个节点的图
* 不相交的图
* 带循环的图形
## 图形搜索算法[](#graph-search-algorithms "Direct link to heading")
* **常见的** -广度优先搜索、深度优先搜索
* **不常见** -拓扑排序,Dijkstra 算法
* **几乎没有**——贝尔曼-福特算法,弗洛伊德-沃肖尔算法,普里姆算法,克鲁斯卡尔算法。你的面试官可能也不认识他们。
### 深度优先搜索[](#depth-first-search "Direct link to heading")
深度优先搜索是一种图遍历算法,它在回溯之前尽可能地沿着每个分支进行探索。堆栈通常用于跟踪当前搜索路径上的节点。这可以通过隐式的[递归](/algorithms/recursion/)堆栈或者实际的[堆栈](/algorithms/stack/)数据结构来完成。
对矩阵进行深度优先搜索的简单模板如下:
```
def dfs(matrix): # Check for an empty matrix/graph. if not matrix: return [] rows, cols = len(matrix), len(matrix[0]) visited = set() directions = ((0, 1), (0, -1), (1, 0), (-1, 0)) def traverse(i, j): if (i, j) in visited: return visited.add((i, j)) # Traverse neighbors. for direction in directions: next_i, next_j = i + direction[0], j + direction[1] if 0 <= next_i < rows and 0 <= next_j < cols: # Add in question-specific checks, where relevant. traverse(next_i, next_j) for i in range(rows): for j in range(cols): traverse(i, j)
```
### 广度优先搜索[](#breadth-first-search "Direct link to heading")
广度优先搜索是一种图遍历算法,它从一个节点开始,在移动到下一个深度级别的节点之前,探索当前深度的所有节点。一个[队列](/algorithms/queue/)通常用于跟踪已经遇到但还没有探索的节点。
在矩阵上进行广度优先搜索的类似模板是这样的。使用双端队列而不是数组/Python 列表很重要,因为双端队列的入队速度是 O(1 ),而数组的入队速度是 O(n)。
```
from collections import deque def bfs(matrix): # Check for an empty matrix/graph. if not matrix: return [] rows, cols = len(matrix), len(matrix[0]) visited = set() directions = ((0, 1), (0, -1), (1, 0), (-1, 0)) def traverse(i, j): queue = deque([(i, j)]) while queue: curr_i, curr_j = queue.popleft() if (curr_i, curr_j) not in visited: visited.add((curr_i, curr_j)) # Traverse neighbors. for direction in directions: next_i, next_j = curr_i + direction[0], curr_j + direction[1] if 0 <= next_i < rows and 0 <= next_j < cols: # Add in question-specific checks, where relevant. queue.append((next_i, next_j)) for i in range(rows): for j in range(cols): traverse(i, j)
```
info
虽然在这个示例中使用递归实现了 DFS,但它也可以像 BFS 一样迭代实现。这两种算法的主要区别在于底层的数据结构(BFS 使用队列,而 DFS 使用堆栈)。Python 中的`deque`类既可以作为堆栈,也可以作为队列。
关于 BFS 和 DFS 的更多提示,你可以参考这个 [LeetCode 帖子](https://leetcode.com/problems/pacific-atlantic-water-flow/discuss/90774/Python-solution-with-detailed-explanation)
### 拓扑排序[](#topological-sorting "Direct link to heading")
有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点 u 到顶点 v 的每个有向边 uv,在排序中 u 在 v 之前。准确地说,拓扑排序是一种图遍历,其中每个节点 v 只有在它的所有依赖关系都被访问之后才被访问。
拓扑排序最常用于作业调度,即一系列依赖于其他作业/任务的作业或任务。作业由顶点表示,如果作业 x 必须在作业 y 开始之前完成,则从 x 到 y 有一条边。
另一个例子是在大学里选修有先修课程的课程。
在下面的示例中,边是一个由两个值组成的数组,第一个值依赖于第二个值。
```
def graph_topo_sort(num_nodes, edges): from collections import deque nodes, order, queue = {}, [], deque() for node_id in range(num_nodes): nodes[node_id] = { 'in': 0, 'out': set() } for node_id, pre_id in edges: nodes[node_id]['in'] += 1 nodes[pre_id]['out'].add(node_id) for node_id in nodes.keys(): if nodes[node_id]['in'] == 0: queue.append(node_id) while len(queue): node_id = queue.pop() for outgoing_id in nodes[node_id]['out']: nodes[outgoing_id]['in'] -= 1 if nodes[outgoing_id]['in'] == 0: queue.append(outgoing_id) order.append(node_id) return order if len(order) == num_nodes else None print(graph_topo_sort(4, [[0, 1], [0, 2], [2, 1], [3, 0]])) # [1, 2, 0, 3]
```
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [岛屿数量](https://leetcode.com/problems/number-of-islands/)
* [洪水填充](https://leetcode.com/problems/flood-fill)
* [01 矩阵](https://leetcode.com/problems/01-matrix/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* 广度优先搜索
* [腐烂的橙子](https://leetcode.com/problems/rotting-oranges/)
* [最少骑士招式(LeetCode Premium)](https://leetcode.com/problems/minimum-knight-moves)
* 要么搜索
* [克隆图形](https://leetcode.com/problems/clone-graph/)
* [太平洋大西洋水流](https://leetcode.com/problems/pacific-atlantic-water-flow/)
* [无向图中连通分量的数量(LeetCode Premium)](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/)
* [图形有效树(LeetCode Premium)](https://leetcode.com/problems/graph-valid-tree/)
* 拓扑排序
* [课程表](https://leetcode.com/problems/course-schedule/)
* [外星人字典(LeetCode Premium)](https://leetcode.com/problems/alien-dictionary/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 为编码面试堆备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/heap/](https://www.techinterviewhandbook.org/algorithms/heap/)
<header>
## 简介[](#introduction "Direct link to heading")
堆是专门的基于树的数据结构,它是满足堆属性的完整的树。
* 最大堆——在最大堆中,一个节点的值必须是整个子树中最大的。对于树中的所有节点,相同的属性必须递归为真。
* 最小堆——在最小堆中,一个节点的值必须是整个子树中所有节点值中最小的。对于树中的所有节点,相同的属性必须递归为真。
在算法访问的上下文中,堆和优先级队列可以被视为相同的数据结构。当需要重复移除具有最高(或最低)优先级的对象时,或者当插入需要穿插移除根节点时,堆是一种有用的数据结构。
## 学习资源[](#learning-resources "Direct link to heading")
* [学会爱堆](https://medium.com/basecs/learning-to-love-heaps-cef2b273a238),basecs
* 用堆排序将所有的东西堆起来
* 詹姆斯·阿斯彭斯,耶鲁大学
## 实现[](#implementations "Direct link to heading")
| 语言 | 应用程序接口 |
| --- | --- |
| C++ | [T2`std::priority_queue`](https://docs.microsoft.com/en-us/cpp/standard-library/priority-queue-class) |
| Java 语言(一种计算机语言,尤用于创建网站) | [T2`java.util.PriorityQueue`](https://docs.oracle.com/javase/10/docs/api/java/util/PriorityQueue.html) |
| 计算机编程语言 | [T2`heapq`](https://docs.python.org/library/heapq.html) |
| Java Script 语言 | 不适用的 |
## 时间复杂度[](#time-complexity "Direct link to heading")
| 操作 | 大 O |
| --- | --- |
| 查找最大值/最小值 | O(1) |
| 插入 | O(log(n)) |
| 去除 | O(log(n)) |
| Heapify(从给定的元素数组中创建一个堆) | O(n) |
## 技巧[](#techniques "Direct link to heading")
### 提及`k`[](#mention-of-k "Direct link to heading")
如果你看到问题中提到了一个最高或最低的 *k* ,这通常是一个信号,表明可以使用堆来解决问题,比如在[中的 Top K frequency Elements](https://leetcode.com/problems/top-k-frequent-elements/)
如果你需要顶部的 k 个 T2 元素,使用一个最小堆,大小为 k 个 T4。遍历每个元素,将其推入堆中(对于 python `heapq`,在推入之前反转值以找到最大值)。每当堆大小超过 *k* 时,移除最小的元素,这将保证您拥有 *k* 个最大的元素。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [合并 K 个排序列表](https://leetcode.com/problems/merge-k-sorted-lists/)
* [K 个离原点最近的点](https://leetcode.com/problems/k-closest-points-to-origin/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [前 K 个频繁元素](https://leetcode.com/problems/top-k-frequent-elements/)
* [从数据流中找出中值](https://leetcode.com/problems/find-median-from-data-stream/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/trie/](https://www.techinterviewhandbook.org/algorithms/trie/)
<header>
## 简介[](#introduction "Direct link to heading")
尝试是特殊的树(前缀树),使搜索和存储字符串更有效。尝试有许多实际应用,比如进行搜索和提供自动完成。了解这些常见的应用程序是很有帮助的,这样您就可以很容易地确定何时可以使用 trie 有效地解决问题。
熟悉从零开始实现,一个`Trie`类及其`add``remove``search`方法。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [试图理解尝试](https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014),basecs
* [实现 Trie(前缀树)](https://leetcode.com/articles/implement-trie-prefix-tree/),LeetCode
* 附加(仅当您有时间时)
* [压缩基数树而没有(太多)撕裂](https://medium.com/basecs/compressing-radix-trees-without-too-many-tears-a2e658adb9a0),basecs
## 时间复杂度[](#time-complexity "Direct link to heading")
`m`是操作中使用的字符串的长度。
| 操作 | 大 O | 注意 |
| --- | --- | --- |
| 搜索 | O(m) | |
| 插入 | O(m) | |
| 去除 | O(m) | |
## 拐角情况[](#corner-cases "Direct link to heading")
* 在空的 trie 中搜索字符串
* 将空字符串插入到 trie 中
## 技巧[](#techniques "Direct link to heading")
有时,将单词字典(在列表中给出)预处理成 trie,将提高在 n 个单词中搜索长度为 k 的单词的效率。搜索变成 O(k)而不是 O(n)。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [实现 Trie(前缀树)](https://leetcode.com/problems/implement-trie-prefix-tree)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [添加和搜索单词](https://leetcode.com/problems/add-and-search-word-data-structure-design)
* [断字](https://leetcode.com/problems/word-break)
* [单词搜索二](https://leetcode.com/problems/word-search-ii/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 额外的
\ No newline at end of file
# 编码面试的动态编程备忘单
> 原文:[https://www . techinterviewphandbook . org/algorithms/dynamic-programming/](https://www.techinterviewhandbook.org/algorithms/dynamic-programming/)
<header>
## 简介[](#introduction "Direct link to heading")
动态规划通常用于解决优化问题。提高 DP 的唯一方法就是练习。认识到一个问题可以通过 DP 来解决需要一定的实践。
## 学习资源[](#learning-resources "Direct link to heading")
* [揭开动态编程的神秘面纱](https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296)
* [动态规划——解决任何动态规划面试问题的 7 个步骤](https://dev.to/nikolaotasevic/dynamic-programming--7-steps-to-solve-any-dp-interview-problem-3870)
* [更少的重复,更多的动态编程](https://medium.com/basecs/less-repetition-more-dynamic-programming-43d29830a630),basecs
* [动态编程](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#dynamicProgramming),詹姆斯·阿斯彭斯,耶鲁大学
## 技巧[](#techniques "Direct link to heading")
有时,您不需要将整个 DP 表存储在内存中,矩阵的最后两个值或最后两行就足够了。
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [爬楼梯](https://leetcode.com/problems/climbing-stairs/)
* [硬币找零](https://leetcode.com/problems/coin-change/)
* [入室抢劫犯](https://leetcode.com/problems/house-robber/)
* [最长递增子序列](https://leetcode.com/problems/longest-increasing-subsequence/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [0/1 背包或分区等于子集和](https://leetcode.com/problems/partition-equal-subset-sum/)
* [最长公共子序列](https://leetcode.com/problems/longest-common-subsequence/)
* [断字问题](https://leetcode.com/problems/word-break/)
* [组合和](https://leetcode.com/problems/combination-sum-iv/)
* [入室抢劫二](https://leetcode.com/problems/house-robber-ii/)
* [解码方式](https://leetcode.com/problems/decode-ways/)
* [独特的路径](https://leetcode.com/problems/unique-paths/)
* [跳跃游戏](https://leetcode.com/problems/jump-game/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [探索动态编程模式进行编码面试](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-dynamic-programming)[](#grokking-dynamic-programming-patterns-for-coding-interviews "Direct link to heading")
由著名的[“探索编码面试”](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)的幕后人员为您带来,这是为数不多的专注于帮助您更好地解决动态编程问题的课程之一。如果你面试的是以问动态编程问题闻名的公司(-咳咳-谷歌-咳咳-),这个课程应该是有帮助的。
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的二进制备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/binary/](https://www.techinterviewhandbook.org/algorithms/binary/)
<header>
## 简介[](#introduction "Direct link to heading")
二进制数字系统和位操作的知识在编码面试中不太重要,因为大多数软件工程师不需要处理位,这在处理低级系统和编程语言时更常用。他们有时仍然会被问到,所以你至少应该知道如何在你选择的编程语言中将一个数从十进制形式转换成二进制形式,反之亦然。
## 学习资源[](#learning-resources "Direct link to heading")
* 读物
* [位,字节,用二进制](https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa)构建,basecs
* [位运算](https://en.wikipedia.org/wiki/Bitwise_operation),维基百科
* 录像
* [算法:位操作](https://www.youtube.com/watch?v=NLKQEOgBAnw),黑客等级
* 实践
* [练习位操作](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/)
## 拐角情况[](#corner-cases "Direct link to heading")
* 注意并检查溢出/下溢
* 负数
## 技巧[](#techniques "Direct link to heading")
有时会问一些涉及二进制表示和位运算的问题,您必须非常熟悉如何在您选择的编程语言中将一个数字从十进制形式转换为二进制形式(反之亦然)。
一些有用的实用程序片段:
| 技术 | 密码 |
| --- | --- |
| 第 k 个<sup>测试位</sup>被置位 | `num & (1 << k) != 0`。 |
| 设置第 k <sup></sup>位 | `num &#124;= (1 << k)` |
| 关闭第 k 个<sup></sup> | `num &= ~(1 << k)`。 |
| 切换第 k 个<sup></sup>位 | `num ^= (1 << k)`。 |
| 乘以 2 <sup>k</sup> | `num << k` |
| 除以 2 <sup>k</sup> | `num >> k` |
| 检查一个数是否是 2 的幂 | `(num & num - 1) == 0``(num & (-num)) == num` |
| 交换两个变量 | `num1 ^= num2; num2 ^= num1; num1 ^= num2` |
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [两个整数之和](https://leetcode.com/problems/sum-of-two-integers/)
* [1 位数](https://leetcode.com/problems/number-of-1-bits/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [计数位数](https://leetcode.com/problems/counting-bits/)
* [缺少数字](https://leetcode.com/problems/missing-number/)
* [反转位](https://leetcode.com/problems/reverse-bits/)
* [单号](https://leetcode.com/problems/single-number/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的数学备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/math/](https://www.techinterviewhandbook.org/algorithms/math/)
<header>
## 简介[](#introduction "Direct link to heading")
数学是计算机科学的基础,每个程序员和计算机科学家都需要有基本的数学知识。幸运的是,出于编写面试代码的目的,通常不会涉及太多的数学知识,但是了解一些基本的数学技巧是有帮助的,因为你可能会被要求执行数学运算。
## 面试时要注意的事情[](#things-to-look-out-for-during-interviews "Direct link to heading")
* 如果代码涉及除法或模运算,记得检查除法或模 0 的情况。
* 如果您使用的是 Java 和 C++之类的类型化语言,请检查并处理溢出/下溢。至少,提及溢出/下溢是可能的,并询问您是否需要处理它。
* 考虑负数和浮点数。这听起来可能是显而易见的,但在面试压力下,许多显而易见的案例都被忽视了。
## 常用公式[](#common-formulas "Direct link to heading")
| | 公式 |
| --- | --- |
| 检查一个数字是否是偶数 | `num % 2 == 0` |
| 1 到 N 的和 | 1 + 2 + ...+ (N - 1) + N = (N+1) * N/2 |
| 几何级数的和 | 2<sup>0</sup>+2<sup>1</sup>+2<sup>2</sup>+2<sup>3</sup>+...2 <sup>n</sup> = 2 <sup>n+1</sup> - 1 |
| N 的置换 | n!/ (N-K)! |
| N 的组合 | n!/ (K! * (N-K)!) |
## 技巧[](#techniques "Direct link to heading")
### [一个数的倍数](#multiples-of-a-number "Direct link to heading")
当一个问题涉及到“一个数是否是 X 的倍数”时,模运算符会很有用。
### 比较浮动[](#comparing-floats "Direct link to heading")
处理浮点数时,注意舍入误差。考虑使用 epsilon 比较来代替相等检查。例如`abs(x - y) <= 1e-6`而不是`x == y`
### 快速运算符[](#fast-operators "Direct link to heading")
如果问题要求你实现一个操作符,比如幂、平方根或除法,并希望它比 O(n)快,那么某种形式的加倍(快速取幂)或减半(二分搜索法)通常是可行的方法。例子: [Pow(x,n)](https://leetcode.com/problems/powx-n/)[Sqrt(x)](https://leetcode.com/problems/sqrtx/)
## 拐角情况[](#corner-cases "Direct link to heading")
* 被 0 除
* 乘以 1
* 负数
* 漂浮物
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [Pow(x,n)](https://leetcode.com/problems/powx-n/)
* [Sqrt(x)](https://leetcode.com/problems/sqrtx/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [整数到英文单词](https://leetcode.com/problems/integer-to-english-words/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 编码面试的几何备忘单
> 原文:[https://www.techinterviewhandbook.org/algorithms/geometry/](https://www.techinterviewhandbook.org/algorithms/geometry/)
<header>
## 简介[](#introduction "Direct link to heading")
几何学是数学的一个分支,它研究与距离、形状、大小和图形的相对位置有关的空间性质。大多数计算机科学课程都不教授高等几何(如 3D 几何),所以你可以预期你只会被问到 2D 几何。
在算法面试中,几何通常不是问题的焦点(毕竟你不会被评估数学)。在这个问题中,你通常必须使用其他算法和/或数据结构。
## 拐角情况[](#corner-cases "Direct link to heading")
* 零值。这总会让人们。
## 技巧[](#techniques "Direct link to heading")
### 两点之间的距离
当比较两点之间的时,使用 dx <sup>2</sup> + dy <sup>2</sup> 就足够了。没有必要对该值求平方根。例子: [K 个离原点最近的点](https://leetcode.com/problems/k-closest-points-to-origin/)
### 重叠圆圈[](#overlapping-circles "Direct link to heading")
要找出两个圆是否重叠,请检查两个圆的圆心之间的距离是否小于它们的半径之和。
### 重叠矩形[](#overlapping-rectangles "Direct link to heading")
如果下列条件成立,则两个矩形重叠:
```
overlap = rect_a.left < rect_b.right and \
rect_a.right > rect_b.left and \ rect_a.top > rect_b.bottom and \ rect_a.bottom < rect_b.top
```
这里有一个[很好的可视化](https://silentmatt.com/rectangle-intersection/)。例子:[矩形重叠](https://leetcode.com/problems/rectangle-overlap/)
## 样题[](#sample-questions "Direct link to heading")
* 你有一个上面有许多矩形的平面,找出有多少个矩形相交。
* 您会使用哪种数据结构来查询 2D 平面上一个集合的 k 个最近点?
* 给定许多点,找出最接近原点的 k 个点。
* 你如何三角化一个多边形?
## 基本问题[](#essential-questions "Direct link to heading")
如果你在学习这个话题,这些是需要练习的基本问题。
* [矩形重叠](https://leetcode.com/problems/rectangle-overlap/)
## 推荐练习题[](#recommended-practice-questions "Direct link to heading")
*这些是在你为题目学习并练习了基本问题后推荐练习的问题。*
* [K 个离原点最近的点](https://leetcode.com/problems/k-closest-points-to-origin/)
* [矩形区域](https://leetcode.com/problems/rectangle-area/)
## 推荐课程[](#recommended-courses "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
</header>
\ No newline at end of file
# 混杂的
\ No newline at end of file
# 顶级公司的面试形式
> 原文:[https://www . techinterviewphandbook . org/interview-formats-top-companies/](https://www.techinterviewhandbook.org/interview-formats-top-companies/)
<header>info
由于 COVID 旅行限制,许多公司甚至在现场进行远程面试,因此说明可能会有所不同。
有你想了解更多的公司吗?发送电子邮件至[联系我们{ at } techinterviewbhank . org](mailto:contact@techinterviewhandbook.org)
## Airbnb[](#airbnb "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话面试:
* CoderPad/CodePen 上的 1 或 2 个算法/前端
* 现场(一般):
* CoderPad 上的 2 x 算法编码
* 1 个系统设计/架构
* 1 x 过去的经验/项目
* 2 个跨职能部门
* 现场(前端):
* CodePen 上的 2 x 前端编码。使用任何框架/库
* 在自己的笔记本电脑上编写 1 个通用代码
* 1 x 过去的经验/项目
* 2 个跨职能部门
* 小贴士:
* 所有的课程都包括在你自己的笔记本电脑上编码。提前准备您的开发环境
* 如果需要的话,你可以查阅 API
* 他们似乎在所有的编码过程中都高度重视可编译、可运行的代码
* 跨职能面试将包括让 Airbnb 任何学科的员工与你交谈。这些面试大多是非技术性的,但对 Airbnb 极其重要,因为它们高度强调文化契合度。一定要查看 Airbnb 的行为问题部分,以了解会出现什么样的问题
## 体式[](#asana "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话面试
* 现场(产品工程师):
* 3 x 算法和系统设计在同一会话中在白板上完成
* 笔记本电脑上的 1 x 算法及系统设计。本课程包括在您自己的笔记本电脑上编写代码,在大约 45 分钟内解决 3 个定义明确的算法问题,之后会有一名工程师来与您一起审查代码。你不应该在处理问题的时候运行代码
* 小贴士:
* 没有提出前端问题
* Asana 高度重视系统设计,并大量使用白板。你不必为前三次面试的算法问题写代码
* 所有 4 节课都涉及算法和系统设计。其中一节课将由工程经理主持
* 最后一节将涉及在你自己的笔记本电脑上编码。提前准备您的开发环境
* 无论是产品工程师还是工程通才,他们的面试形式和问题都是相似的
## 下拉框[](#dropbox "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话采访:
* CoderPad/CodePen 上的 2 x 算法/前端
* 现场(前端):
* CodePen 上的 2 个前端。只允许普通的 JS 或 jQuery
* 1 x coder pad 上的通用编码
* 周围 1 个。会见工程经理,讨论过去的经验和工作方式
* 小贴士:
* 你可以在自己的笔记本电脑上编写代码,并查找 API
* Dropbox 招聘人员非常友好,他们会给你有用的信息,告诉你在接下来的面试中会遇到什么样的问题
* 其中一个前端会话包括在 Dropbox 网站上编写一个像素完美的真实页面。你会得到一个所需页面的规格,并要求你在面试期间创建一个工作版本
## 谷歌[](#google "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话面试:
* Google Doc 上的 1 或 2 倍算法
* 现场:
* 白板上 1 或 2 个前端。根据问题的不同,可能需要使用普通的 JS(或者最多是 jQuery)。(仅前端)
* 白板上的 2 到 4 倍算法
* 1 x 一般认知能力、领导力和“谷歌性”。
* 团队匹配
* 与不同团队中对您的个人资料感兴趣的经理交谈
* 小贴士:
* 在极少数情况下,候选人甚至可以被允许跳过电话面试环节,直接进入现场面试
* 对于非应届毕业生,只有当你成功匹配到一个团队时,你才会收到一份工作邀请
## 的确[](#indeed "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话面试(可选)
* 现场:
* 1 次关于 HackerRank 的在线评估(针对 L0 - L2)
* 1 x 恢复讨论
* HackerRank 上的 1 或 2 倍算法
* GitHub 上的 1 次代码审查
* 1 或 2 个系统设计(针对 L3+)
* 1 次技术演示(针对 L4 以上)
* 小贴士:
* 如果你面试的是一个特定的职位,门槛会有所不同
* 招聘决策和调配是分开讨论的;水平由经验和领导信号决定
* 如果你在面试中表现出色,但该职位已经有人了,其他招聘经理可以拿走你的包裹
## 升 [](#lyft "Direct link to heading") 级
* 招聘人员电话屏幕
* 技术电话面试:
* 1 x 算法 JSFiddle 上的前端
* 现场(前端):
* coder pad/您自己的笔记本电脑上的 4 个前端。使用任何语言/框架
* 1 倍行为。会见工程经理,仔细阅读候选人的简历
* 小贴士:
* 可以使用白板和/或笔记本电脑
* 对于前端编码,我选择使用 React,并且必须使用`create-react-app`在现场设置项目
## [元(原为脸书)](#meta-previously-facebook "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话采访:
* Skype/CoderPad 上的 1 或 2 个算法/前端
* 现场:
* 2 次白板上的技术编码访谈
* 1 倍行为。会见工程经理,讨论过去的经验和工作方式
* 白板上的 1 个设计/架构
* 现场(大学毕业生):
* 2 次白板上的技术编码访谈
* 1 倍行为。会见工程经理,讨论过去的经验和工作方式
* 小贴士:
* 你只能使用白板(或墙)。不涉及笔记本电脑
* 在行为测试中,你可能会在测试结束时被问到一个技术问题。前端候选人将被给予一个小的 HTML/CSS 问题接近会议结束
* 在编码过程中,根据您完成问题的速度,可能会问您一个或多个问题
## Palantir[](#palantir "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话面试:
* 通过 HackerRank CodePair 和 Skype 的 1 x 算法
* 现场(一般):
* 白板上的 2 x 算法
* 白板上的 1 x 分解(系统设计)
* 现场(前端):
* 在您自己的笔记本电脑上安装 1 个前端。这个环节大约持续 1.5 小时。使用任何库/框架
* 白板上的 1 x 分解(系统设计)
* 小贴士:
* 我选择使用 React,并且不得不使用`create-react-app`在现场建立项目
* 技术会议结束后,你可能会被要求与工程经理会面,这不一定是件好事/坏事
## WhatsApp[](#whatsapp "Direct link to heading")
* 招聘人员电话屏幕
* 技术电话面试:
* CoderPad 上的 2 x 算法
* 现场(Web 客户端开发人员):
* 白板上的 4 x 算法
* 小贴士:
* 没有提出前端问题
* 其中一名面试官是工程经理
</header>
\ No newline at end of file
# 备忘单(面试官)
> 原文:[https://www . techinterviewphandbook . org/visitor-cheat sheet/](https://www.techinterviewhandbook.org/interviewer-cheatsheet/)
<header>
这是一个直截了当的,为面试官提炼出来的技术面试注意事项**,主要针对算法面试。其中一些可能只适用于电话屏幕或白板面试,但大多数适用于两者。作为一名面试官,我在每次面试前都会修改这份清单,以此来提醒自己,并最终将它们全部内化,以至于我不再需要依赖它。**
如果你是候选人,你可能不需要很好地了解这一部分。你可以通过阅读这篇文章来更好地理解面试官在面试中应该做什么。
#### 图例[](#legend "Direct link to heading")
* ✅ = Do
* ∞不要
* ∞情境性
### 面试前[](#before-interview "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 确保你的周围光线充足。 |
| 981 号房 | 找一个安静的环境,有良好的网络连接。 |
| 981 号房 | 确保网络摄像头和音频工作正常。测试你的 VC 应用运行良好。 |
| 981 号房 | 准备两到三个问题,熟悉解决问题的不同方法。好的问题有多个解决方案,每个都有不同的权衡。 |
| 981 号房 | 从不同主题中选择问题,找出可能的知识缺口。 |
| 981 号房 | 熟悉编码环境(CoderPad/CodePen)。设置编码快捷键,打开自动补全,制表符间距等。 |
### 简介[](#introduction "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 检查候选人是否想使用洗手间或休息一下。 |
| 981 号房 | 概述面试形式(介绍、持续时间、可用的编程语言、最后 5 分钟问答时间)。 |
| 981 号房 | 做一个自我介绍,让候选人介绍他们自己。 |
| 981 号房 | 向候选人解释将会有多个问题(如果相关的话),他们不必完成所有问题,您可能会突然打断他们。 |
| -好的 | 允许候选人花太多时间介绍自己。 |
### 交付问题后[](#upon-delivering-the-question "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 询问候选人之前是否见过该问题。 |
| 981 号房 | 举一个小例子来说明问题和期望的输出。 |
| 981 号房 | 让候选人在开始编码之前先讨论解决方案。 |
| 981 号房 | 在适当的地方提供提示。 |
| 981 号房 | 如果候选人在提供提示后仍然停滞不前,提供解决方案并转向编码,这样你就可以获得编码信号。 |
### 编码期间[](#during-coding "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 如果是白板面试,站在候选人旁边,但也要给他们空间,而不是保持距离,例如坐下。 |
| 981 号房 | 记下所有的[正负信号](/coding-interview-rubrics/)。 |
| 981 号房 | 如果你有多个问题,不要让候选人在一个问题上花太多时间,尤其是如果第一个问题很容易。 |
| -好的 | 以过于明显的方式查看时间。 |
### 编码后[](#after-coding "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 要求候选人提供测试用例,并与他们一起运行代码。 |
| 981 号房 | 确定候选人遗漏的边缘案例,并要求候选人解决它们。问候选人“如果 X 是输入会怎样?您的代码会产生什么?”而不是直接指出问题。 |
| 981 号房 | 记下候选人在每个问题上花费的时间,以纳入反馈。 |
| 981 号房 | 求时间复杂度和空间分析。 |
| 981 号房 | 把代码保存在某个地方——拍张照片或者把代码复制出来。 |
| 981 号房 | 还剩 5 分钟时,停止候选人。例如(“我会在这里打断你,让我们进入下一部分”) |
### 总结[](#wrap-up "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 允许候选人提问并尽你所能回答他们。 |
| 981 号房 | 感谢候选人,并祝他们一切顺利。 |
### 岗位面试[](#post-interview "Direct link to heading")
| | 东西 |
| --- | --- |
| 981 号房 | 尽快写下反馈,以免忘记细节。 |
</header>
\ No newline at end of file
# 风景
> 原文:[https://www.techinterviewhandbook.org/landscape/](https://www.techinterviewhandbook.org/landscape/)
<header>
这里涵盖的大部分内容都是针对湾区的。因地理位置而产生的景观差异在下面的[中简单提及。](#geographical-location)
## 软件工程师的职业前景[](#career-prospects-as-a-software-engineer "Direct link to heading")
### 高需求[](#high-demand "Direct link to heading")
几乎每个领域都利用技术,因此几乎每个行业都需要软件工程师。对工程师的需求高于供给,导致一般高薪工作。此外,需求还在持续增长。
### 稳定的职业[](#stable-career "Direct link to heading")
计算机科学正在迅速普及,工程是一个备受推崇的职业。与创意行业不同,你不必成为行业中的前 1%才能过上舒适的生活。一名刚从大学毕业、在硅谷公司(大公司和初创公司)工作的工程师,起薪有望超过 10 万美元,而且还会越来越好。
### 需要终身学习[](#requires-lifelong-learning "Direct link to heading")
科技行业是一个发展极其迅速的行业。今天使用的许多技术在十年前甚至还不存在/不流行;2009 年,移动应用开发和区块链几乎是闻所未闻的。工程师需要不断提升自己的技能,以适应就业市场的需求。对于热爱学习的人来说,工程是一个伟大的职业。
### 灵活[](#flexible "Direct link to heading")
就时间、地点和环境而言,软件工程工作可能是最灵活的工作。物理位置通常不是问题,许多科技公司都位于偏远地区。没有正式服装可穿,工作时间通常很灵活。如果你穿着衬衫打着领带去上班,你的同事会奇怪地盯着你。
## 实习 vs 全职[](#internships-vs-full-time "Direct link to heading")
如果你梦想有一天在一家顶级科技公司工作,通过实习生转正获得聘用是实现这一梦想最简单的方式。实习面试非常短(通常只有两轮,而全职职位的面试通常是 4-5 轮)。实习可以让你在一家公司工作很短的时间(3 个月左右),并有助于获得对公司和工程文化的第一手了解。公司也倾向于给高表现的实习生更高回报的工作机会,因为他们已经证明在工作中是有效的,并且可以和现有的员工一起工作;因此雇佣他们被认为是相对低风险的。
顶级科技公司甚至会为初级候选人支付高得离谱的费用:
### 美国[](#united-states "Direct link to heading")
<figure>![Salaries of top tech internships in 2016](../Images/a03ade58617b9a44528f372d6d862f4d.png)
<figcaption>
2016 年美国顶尖科技实习生的薪水([来源](https://twitter.com/rodneyfolz/status/724787290824798209)
</figcaption>
</figure>
### 新加坡[](#singapore "Direct link to heading")
我们进行了一项调查,以了解新加坡著名的科技公司在 2022 年为新员工支付的薪酬,以下是调查结果的样本。查看[完整数据集](https://docs.google.com/spreadsheets/d/1QtC8efWw0mVkGXW4QA9bX4f0nJhGbmFqCfVLSumMZ0I/)[贡献您的数据](https://forms.gle/9oNNJJwespqWBZGw6)
| 公司 | 实习(每月在新加坡发展局) | 应届毕业生年度总数(新加坡元) |
| --- | --- | --- |
| 种类 | $6000 | $150,000 |
| Meta/Facebook | $6000 | $140,000 |
| 谷歌 | $5400 | $110,000 |
| Shopee | $4200 | $100,000 - $140,000 |
| 字节跳动 | $4000 | $85,000 |
| 夺取 | $2500 | 尚无数据 |
| 签证 | $2200 | $75,000 |
注意:应届毕业生的年度总数是近似值,包括基本工资、股票和目标奖金。
## 公司规模[](#company-size "Direct link to heading")
公司根据所处的阶段有不同的关注点,要做的工作类型也可能大不相同。在尚未找到适合市场的产品的早期阶段,公司会快速迭代产品和功能,而已经找到合适产品的大公司会专注于扩展基础设施和增加用户。由于股权不值钱,初创公司的流动薪酬也较低,但如果/当公司首次公开募股或被收购时,有可能赚得更多。
| 尺寸 | 早期启动 | 后期启动 | 大型公司 |
| --- | --- | --- | --- |
| 公司规模 | <100 | 100-1000 | >1000 |
| 补偿 | 底薪比大公司高一点。更高的股本金额,但其价值很难判断,因为该公司的估值不清楚,股票还不值钱。高风险,高回报。 | 底薪比大公司高一点。公司估值更清晰,股票更有机会值钱。 | 取决于公司的声望。补偿通常是市场标准或更好。如果公司上市了,股票就值钱了。 |
| 工作类型 | 主要是产品开发。工程师必须身兼数职——前端、后端、开发、设计等。 | 产品开发和一些基础设施。 | 多样化的角色和专业化的工作;每个角色都有敬业的人。基础设施和生产基础设施工作更为常见。更多的内部调动机会,有时甚至是全球范围的调动。 |
| 职业阶梯 | 无结构。没有(或非常模糊的)职业水平。没有太多正式的指导和培训。 | 有点结构化。 | 非常有条理。定义明确的职业水平。 |
| 迭代速度 | 速度极快。努力寻找适合市场的产品。 | 适中。已经找到适合市场的产品,试图扩大用户群。 | 拥有广泛用户基础的稳定产品。逐步推出变更并进行大量试验。 |
需要注意的是,以上只是一般趋势,也有例外。
## 地理位置[](#geographical-location "Direct link to heading")
| | 美国(硅谷/纽约) | 新加坡 |
| --- | --- | --- |
| 起薪 | 10 万美元 | 每月 5243 美元(中位数),6316 美元(第 75 百分位) |
| 人才准入 | 全球人才、多样化的国籍和背景 | 通常是地区性的,大部分是亚洲人 |
| 公司类型 | 大公司(脸书、亚马逊、苹果、谷歌、微软等)的总部,初创公司 | 大公司、初创公司的分支机构 |
| 工程工作的类型 | 取决于办公室/公司的规模 | 产品和基础设施(构建新的编程语言、框架和工具) |
*新加坡薪资数据来自[新加坡国立大学 GES 分校,2020 年](https://www.moe.gov.sg/-/media/files/post-secondary/ges-2020/web-publication-nus-ges-2020.pdf)。*
</header>
\ No newline at end of file
# 工程水平
> 原文:[https://www.techinterviewhandbook.org/engineering-levels/](https://www.techinterviewhandbook.org/engineering-levels/)
<header>caution
此部分仍为 WIP。欢迎在我们的 GitHub 第期[上贡献您的想法。](https://github.com/yangshun/tech-interview-handbook/issues/222)
了解工程师的各种职业水平至关重要,因为这有助于确定你应该获得的报酬,也有助于你了解在那个水平上对你的期望。在大多数已经定义了职业等级的公司里,职业等级大致是这样的:初级→软件工程师→高级→职员→高级职员→负责人→研究员
## 职业等级[](#career-levels "Direct link to heading")
### 初级软件工程师[](#junior-software-engineer "Direct link to heading")
*正在进行的工作*
### 软件工程师[](#software-engineer "Direct link to heading")
*正在进行的工作*
### 高级软件工程师[](#senior-software-engineer "Direct link to heading")
*正在进行的工作*
### 软件工程师[职员](#staff-software-engineer "Direct link to heading")
*正在进行的工作*
### 高级职员软件工程师[](#senior-staff-software-engineer "Direct link to heading")
*正在进行的工作*
### 首席软件工程师[](#principal-software-engineer "Direct link to heading")
*正在进行的工作*
### 杰出工程师[](#distinguished-engineer "Direct link to heading")
*正在进行的工作*
### 同行[](#fellow "Direct link to heading")
*正在进行的工作*
#### 参考文献[](#references "Direct link to heading")
* 谷歌软件工程师的薪水
* [Dropbox 工程职业框架](https://dropbox.github.io/dbx-career-framework/overview.html)
* [声云的工程水平](https://developers.soundcloud.com/blog/engineering-levels)
* [每一个公共工程职业阶梯](https://www.swyx.io/career-ladders)
* [progression.fyi](https://progression.fyi/)
</header>
\ No newline at end of file
# 最佳编码面试课程
> 原文:[https://www . techinterviewphandbook . org/best-coding-interview-courses/](https://www.techinterviewhandbook.org/best-coding-interview-courses/)
<header>
如果你喜欢学习更有条理的课程,这里有一些建议。为了通过面试,参加在线课程绝不是必须的。
## 通用[](#general "Direct link to heading")
### [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")
AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**[**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)
### [寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")
设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)
### [掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")
这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)
## Python[](#python "Direct link to heading")
| 课程 | 复习 | 持续时间 | 价格 | 内容 |
| :-- | --- | --- | --- | --- |
| [王牌 Python 编码面试](https://www.educative.io/path/ace-python-coding-interview?aff=x23W) | 4.6/5 | 93h | $ | 基本数据结构和算法+实践。还包括**系统设计**和并发 |
| [Python 中完整的数据结构和算法课程](https://fxo.co/DQpc) | 4.6/5 | 41h | $ | 基本数据结构和算法 |
| 用于数据结构、算法和面试的 Python! | 4.5/5 | 16.5 小时 | $ | 基本数据结构和算法,工作申请,行为面试,谈判 |
## Java[](#java "Direct link to heading")
| 课程 | 复习 | 持续时间 | 价格 | 内容 |
| :-- | --- | --- | --- | --- |
| [王牌 Java 编码面试](https://www.educative.io/path/ace-java-coding-interview?aff=x23W) | 4.6/5 | 55 小时 | $ | 基本数据结构和算法+实践。还包括**系统设计** |
| [Java 数据结构和算法大师班](https://fxo.co/DQpa) | 4.5/5 | 45 小时 | $ | 基本和高级数据结构和算法 |
| [数据结构和算法:使用 Java 进行深入研究](https://fxo.co/DQpW) | 4.5/5 | 16 小时 | $ | 基本数据结构和算法 |
## JavaScript[](#javascript "Direct link to heading")
| 课程 | 复习 | 持续时间 | 价格 | 内容 |
| :-- | --- | --- | --- | --- |
| [Ace JavaScript 编码面试](https://www.educative.io/path/ace-javascript-coding-interview?aff=x23W) | 4.7/5 | 87h | $ | 基本数据结构和算法+实践。还包括**系统设计** |
| [JavaScript 数据结构和算法大师班](https://fxo.co/DQpZ) | 4.5/5 | 45 小时 | $ | 基本和高级数据结构和算法 |
| [掌握编码面试:数据结构+算法](https://fxo.co/DQpY) | 4.6/5 | 19.5 小时 | $ | 基本数据结构和算法,工作申请,行为面试,谈判 |
## C++[](#c "Direct link to heading")
| 课程 | 复习 | 持续时间 | 价格 | 内容 |
| :-- | --- | --- | --- | --- |
| [Ace c++编码面试](https://www.educative.io/path/ace-cpp-coding-interview?aff=x23W) | 4.6/5 | 60h | $ | 基本数据结构和算法+实践。还包括**系统设计**,并发和行为内容 |
</header>
\ No newline at end of file
# 最佳实践问题
> 原文:[https://www . techinterviewphandbook . org/best-practice-questions/](https://www.techinterviewhandbook.org/best-practice-questions/)
<header>tip
截至 2022 年 4 月,我已经制定了一个 [12 周的学习计划](/coding-interview-study-plan/),其中包括复习和练习题的课程。如果你想定制自己的练习题,我还开发了 [Grind 75](https://www.techinterviewhandbook.org/grind75) ,它是 Blind 75 的现代版,你可以定制。
嘿,我是盲人 75 的作者👋!
练习是准备编码面试的最好方法。LeetCode 有一千多个问题。应该练哪个?因此,几年前,我整理了一份关于 [LeetCode](https://leetcode.com) 最重要的 75 个问题的清单。许多其他的 LeetCode 问题是这些单独问题的技术的混合。我在上次找工作时用这个列表只做重要的问题。
[通过从](https://www.teamblind.com/post/New-Year-Gift---Curated-List-of-Top-100-LeetCode-Questions-to-Save-Your-Time-OaM1orEU)[我的 freeCodeCamp 文章](https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/)中提取问题在上分享了这个列表,以节省人们修改时的时间,有人在[leet code 论坛](https://leetcode.com/discuss/general-discussion/460599/blind-75-leetcode-questions)上转发了这个列表。它不知怎么的就炸了,在编码面试现场超级出名,人们甚至给它起了个名字——**盲 75** 。盲人 75 题作为 LeetCode 列表可以在[这里](https://leetcode.com/list/xi4ci4ig/)找到。
几年后,我将列表进一步精简为 50 个问题,并将其分散在 5 周的时间表中。这是建议的修改和练习 LeetCode 上的算法问题的时间表。如果你还没有账户,注册一个,这对你面试的成功至关重要!
在练习时,建议你像对待真正的编码面试一样对待它,并在提交前彻底检查。考虑甚至手动提出一些测试用例,并运行它们来验证正确性!
我为以下问题创建了一个 [LeetCode list](https://leetcode.com/list/9h4lgwl2) (高级问题除外)。请随意使用它来跟踪您的练习进度。
Expert tip
如果你的时间不多了, [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=) 旨在帮助你在最短的时间内通过技术面试**。由谷歌工程师, [AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=) 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。**学习和理解模式,而不是背答案!****
## **第 1 周-序列[](#week-1---sequences "Direct link to heading")**
**在第一周,我们将通过做一些关于数组和字符串的简单和中等的问题来热身。数组和字符串是面试中最常见的问题类型;熟悉它们将有助于建立坚实的基础,更好地处理更棘手的问题。**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 两个总和 | 容易的 | [链接](https://leetcode.com/problems/two-sum/) |
| 包含重复 | 容易的 | [链接](https://leetcode.com/problems/contains-duplicate/) |
| 买卖股票的最佳时机 | 容易的 | [链接](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/) |
| 有效变位词 | 容易的 | [链接](https://leetcode.com/problems/valid-anagram/) |
| 有效括号 | 容易的 | [链接](https://leetcode.com/problems/valid-parentheses/) |
| 最大子阵列 | 容易的 | [链接](https://leetcode.com/problems/maximum-subarray/) |
| 除自身以外的数组乘积 | 中等 | [链接](https://leetcode.com/problems/product-of-array-except-self/) |
| 3 总和 | 中等 | [链接](https://leetcode.com/problems/3sum/) |
| 合并间隔 | 中等 | [链接](https://leetcode.com/problems/merge-intervals/) |
| 分组字谜 | 中等 | [链接](https://leetcode.com/problems/group-anagrams/) |
#### **Optional [​](#optional "Direct link to heading")**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 最大乘积子阵列 | 中等 | [链接](https://leetcode.com/problems/maximum-product-subarray/) |
| 在旋转排序数组中搜索 | 中等 | [链接](https://leetcode.com/problems/search-in-rotated-sorted-array/) |
## **第 2 周-数据结构[](#week-2---data-structures "Direct link to heading")**
**第二周的重点是链表、字符串和基于矩阵的问题。目标是学习处理链表、遍历矩阵和序列分析(数组/字符串)技术的常用例程,如滑动窗口、链表遍历和矩阵遍历。**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 反转一个链表 | 容易的 | [链接](https://leetcode.com/problems/reverse-linked-list/) |
| 检测链表中的循环 | 容易的 | [链接](https://leetcode.com/problems/linked-list-cycle/) |
| 盛水最多的容器 | 中等 | [链接](https://leetcode.com/problems/container-with-most-water/) |
| 在旋转排序数组中查找最小值 | 中等 | [链接](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) |
| 最长重复字符替换 | 中等 | [链接](https://leetcode.com/problems/longest-repeating-character-replacement/) |
| 没有重复字符的最长子字符串 | 中等 | [链接](https://leetcode.com/problems/longest-substring-without-repeating-characters/) |
| 岛屿数量 | 中等 | [链接](https://leetcode.com/problems/number-of-islands/) |
| 从列表末尾删除第 n 个节点 | 中等 | [链接](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) |
| 回文子串 | 中等 | [链接](https://leetcode.com/problems/palindromic-substrings/) |
| 太平洋大西洋水流 | 中等 | [链接](https://leetcode.com/problems/pacific-atlantic-water-flow/) |
| 最小窗口子串 | 困难的 | [链接](https://leetcode.com/problems/minimum-window-substring/) |
## **第 3 周-非线性数据结构[](#week-3---non-linear-data-structures "Direct link to heading")**
**第三周的重点是非线性数据结构,如树、图和堆。您应该熟悉各种树遍历(按序、前序、后序)算法和图遍历算法,如广度优先搜索和深度优先搜索。根据我的经验,使用更高级的图形算法(Dijkstra 的和 Floyd-Warshall 的)是非常罕见的,通常也没有必要。**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 反转/翻转二叉树 | 容易的 | [链接](https://leetcode.com/problems/invert-binary-tree/) |
| 验证二叉查找树 | 中等 | [链接](https://leetcode.com/problems/validate-binary-search-tree/) |
| 非重叠区间 | 中等 | [链接](https://leetcode.com/problems/non-overlapping-intervals/) |
| 根据前序和后序遍历构造二叉树 | 中等 | [链接](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) |
| 前 K 个频繁元素 | 中等 | [链接](https://leetcode.com/problems/top-k-frequent-elements/) |
| 克隆图 | 中等 | [链接](https://leetcode.com/problems/clone-graph/) |
| 课程表 | 中等 | [链接](https://leetcode.com/problems/course-schedule/) |
| 序列化和反序列化二叉树 | 困难的 | [链接](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/) |
| 二叉树最大路径和 | 困难的 | [链接](https://leetcode.com/problems/binary-tree-maximum-path-sum/) |
#### **Optional [​](#optional-1 "Direct link to heading")**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 二叉树的最大深度 | 容易的 | [链接](https://leetcode.com/problems/maximum-depth-of-binary-tree/) |
| 同一棵树 | 容易的 | [链接](https://leetcode.com/problems/same-tree/) |
| 二叉树层次顺序遍历 | 中等 | [链接](https://leetcode.com/problems/binary-tree-level-order-traversal/) |
| 编码和解码字符串 | 中等 | [链接](https://leetcode.com/problems/encode-and-decode-strings/)(溢价) |
## **第 4 周-更多数据结构[](#week-4---more-data-structures "Direct link to heading")**
**第 4 周建立在前几周的知识基础上,但是问题的难度增加了。希望在面试中看到这样的问题。您可以在更高级的数据结构上进行更多的练习,比如(但不仅限于)堆和尝试,这些不太常见,但仍然会被问到。**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 另一棵树的子树 | 容易的 | [链接](https://leetcode.com/problems/subtree-of-another-tree/) |
| BST 的最低共同祖先 | 容易的 | [链接](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/) |
| 实现 Trie(前缀树) | 中等 | [链接](https://leetcode.com/problems/implement-trie-prefix-tree/) |
| 添加和搜索单词 | 中等 | [链接](https://leetcode.com/problems/add-and-search-word-data-structure-design/) |
| BST 中最小的元素 | 中等 | [链接](https://leetcode.com/problems/kth-smallest-element-in-a-bst/) |
| 合并 K 个排序列表 | 困难的 | [链接](https://leetcode.com/problems/merge-k-sorted-lists/) |
| 从数据流中查找中值 | 困难的 | [链接](https://leetcode.com/problems/find-median-from-data-stream/) |
| 插入间隔 | 中等 | [链接](https://leetcode.com/problems/insert-interval/) |
| 最长连续序列 | 中等 | [链接](https://leetcode.com/problems/longest-consecutive-sequence/) |
| 单词搜索 II | 困难的 | [链接](https://leetcode.com/problems/word-search-ii/) |
#### **Optional [​](#optional-2 "Direct link to heading")**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 会议室 | 容易的 | [链接](https://leetcode.com/problems/meeting-rooms/)(溢价) |
| 第二会议室 | 中等 | [链接](https://leetcode.com/problems/meeting-rooms-ii/)(溢价) |
| 图形有效树 | 中等 | [链接](https://leetcode.com/problems/graph-valid-tree/)(溢价) |
| 无向图中连通分量的数目 | 中等 | [链接](https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/)(溢价) |
| 外星人词典 | 困难的 | [链接](https://leetcode.com/problems/alien-dictionary/)(溢价) |
## **第 5 周-动态编程[](#week-5---dynamic-programming "Direct link to heading")**
**第五周的重点是动态规划(DP)问题。就我个人而言,作为一名面试官,我并不喜欢 DP 问题,因为它们并不真正适用于实际情况,坦率地说,如果我在面试中被要求回答这些棘手的 DP 问题,我就不会得到这份工作。然而,像谷歌这样的公司仍然会问 DP 问题,如果加入谷歌是你的梦想,DP 是不可避免的。**
**DP 问题可能很难掌握,最好的解决方法是...你猜对了——练习!熟悉记忆和回溯的概念。**
**实际上,学习和练习 DP 问题的投资回报率(ROI)很低。因此,DP 问题不那么重要/可选,你应该只在你有空闲时间,并且你非常渴望涵盖所有基础(和谷歌面试)的情况下才这样做。**
| 问题 | 困难 | LeetCode |
| :-- | --- | --- |
| 爬楼梯 | 容易的 | [链接](https://leetcode.com/problems/climbing-stairs/) |
| 硬币零钱 | 中等 | [链接](https://leetcode.com/problems/coin-change/) |
| 最长增长子序列 | 中等 | [链接](https://leetcode.com/problems/longest-increasing-subsequence/) |
| 组合和 | 中等 | [链接](https://leetcode.com/problems/combination-sum-iv/) |
| 入室抢劫犯 | 中等 | [链接](https://leetcode.com/problems/house-robber/) |
| 入室抢劫犯 2 | 中等 | [链接](https://leetcode.com/problems/house-robber-ii/) |
| 解码方式 | 中等 | [链接](https://leetcode.com/problems/decode-ways/) |
| 独特的路径 | 中等 | [链接](https://leetcode.com/problems/unique-paths/) |
| 跳跃游戏 | 中等 | [链接](https://leetcode.com/problems/jump-game/) |
| 移行点 | 中等 | [链接](https://leetcode.com/problems/word-break/) |
#### **动态编程教程[](#dynamic-programming-course "Direct link to heading")**
* **[探索编码面试的动态编程模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-dynamic-programming)**
## **精品课程[](#quality-courses "Direct link to heading")**
**如果你想要更多的结构化算法练习,我推荐以下课程:**
### **[AlgoMonster](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)[T3】](#algomonster "Direct link to heading")**
**AlgoMonster 旨在帮助你在最短的时间内通过技术面试。由谷歌工程师开发的 AlgoMonster 使用数据驱动的方法来教你最有用的关键问题模式,并有内容帮助你快速修改基本的数据结构和算法。最重要的是,AlgoMonster 不是基于订阅的——支付一次性费用,就可以获得**终身访问**。 [**今天加入七折优惠→**](https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack=)**
### **[寻找编码面试:编码问题的模式](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)[](#grokking-the-coding-interview-patterns-for-coding-questions "Direct link to heading")**
**设计大师的这门课程扩展了推荐练习题中的问题,但从问题模式的角度来进行练习,这是一种我也同意的学习方法,我个人也使用这种方法来更好地编写面试代码。本课程允许你用 Java、Python、C++、JavaScript 来练习选定的问题,并提供这些语言的示例解决方案以及一步一步的可视化。**学习和理解模式,而不是背答案!** [**现在获得终身使用权→**](https://designgurus.org/link/kJSIoU?url=https%3A%2F%2Fdesigngurus.org%2Fcourse%3Fcourseid%3Dgrokking-the-coding-interview)**
### **[掌握编码面试:数据结构+算法](https://fxo.co/DQpY)[](#master-the-coding-interview-data-structures--algorithms "Direct link to heading")**
**这本 Udemy 畅销书是评分最高的面试准备课程之一(4.6 星,21.5k 评分,135k 学生),包含了价值 **19 个小时**的内容。像技术面试手册一样,它超越了编码面试,涵盖了简历,非技术面试,谈判。是一个全包!请注意,JavaScript 用于编码演示。 [**结账→**](https://fxo.co/DQpY)**
</header>
\ No newline at end of file
# 技术面试手册
来源:[https://yazhouseba.co/article.php](https://yazhouseba.co/article.php)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册