在面试开始时,大多数情况下面试官会简单介绍自己和他们在公司的角色,然后让你做自我介绍。
在自我介绍之后,面试官会给你一个问题陈述。如果您在共享文本编辑器中答题,他们很可能将问题描述和测试用例一起粘贴到编辑器中,然后将问题读给您听。
输入是只有整数,还是可以有其他类型?
我能假设输入是有序的吗?
输入是保证有元素还是可以为空?
如果给出了无效输入,我该如何处理?
提出明确的问题不仅能帮助你更好地理解问题,还能表现出对细节的关注,以及对边缘情况的考虑。
尝试找出适用的数据结构或算法。分解问题并尝试找到你会的常用解法。弄清楚问题需要你做什么,并考虑什么样的数据结构或算法可以以较好的时间复杂度来完成。
把你的想法都说出来。这会让面试官知道你善于权衡利弊。如果问题涉及到查看子数组,那么应该考虑滑动窗口,因为每个窗口都代表一个子数组。即使你错了,面试官仍然会欣赏你的思考过程。
通过把想法都说出来,面试官也可以借此给你提示,并为你指出正确的方向。
一旦决定了要使用的数据结构/算法,现在就需要构造实际的算法。在编码之前,你应该考虑算法的大致步骤,向面试官解释这些步骤,并确保他们理解并同意这是一个合理的方法。通常,如果你走错了路,他们会巧妙地暗示你。
在这个阶段你能接受面试官所说的话是 非常 重要的。请记住:他们知道最佳解决方案。如果他们给你提示,那是因为他们希望你成功。不要固执,准备好探索他们给你的想法。
一旦你想出了一个算法,并让面试官同意了,就该开始写代码了。
如果你遇到困难或意识到你最初的计划可能行不通,不要慌。与面试官交流你的疑虑。如果你默默地挣扎,很可能又会钻牛角尖。
一种策略是首先实现一个暴力解决方案,同时承认 这是一个次优解决方案。完成后,分析算法的每个部分,找出哪些步骤 “慢”,并尝试思考如何加快速度。让面试官参与进来,让他们参与讨论 —— 他们通常愿意提供帮助。
一旦你写完代码,你的面试官可能会想要测试你的代码。根据公司的不同,会有一些不同的环境:
这些平台类似于 LeetCode。将会有各种各样的测试用例 —— 小输入,大输入,测试边缘用例的输入。
这种环境给您的代码带来了最大的压力,因为会暴露出不完美的解决方案。
但是,它也为创建您自己的测试带来了最小的压力,因为测试用例已经内置在了内部。
这些平台通常是支持运行代码的共享文本编辑器。面试官会希望你编写自己的测试用例。
要真正测试代码,你应该在代码的最外层范围编写,即代码将首先运行的地方。假设你在函数中解决了问题 (就像在 LeetCode 上),你可以用你编写的测试用例调用你的函数,并将结果打印到控制台。
在编写自己的测试时,请确保尝试各种测试。包括边缘情况、直觉输入和可能无效的输入 (如果面试官想让你处理这种情况)。
这些平台只是共享文本编辑器,不支持运行代码。面试官会希望你编写自己的测试用例,并且手动模拟运行。
为了 “测试” 代码,你必须在每个测试用例中手动检查算法。试着压缩一些琐碎的部分 —— 例如,你正在创建一个前缀和,不要 字面上 遍历每个元素的 for 循环。可以这样说:“在这个 for 循环之后,我们将有一个前缀和,他是这样的……”。
在遍历代码时,将函数中使用的变量写入 (在编辑器中,函数外部的某处),并不断更新它们。
不管在什么情况下,如果您的代码出现了错误,不要慌!如果环境支持运行代码,请在相关位置放置打印语句以尝试识别问题。用一个小的测试用例手动遍历(就像你没有运行环境时所做的那样)。当你这样做的时候,讨论变量的期望值应该是什么,并将它们与实际值进行比较。再说一遍,你说话越多,面试官就越容易帮助你。
在编写算法并运行测试用例之后,准备回答关于算法的问题。你应该准备好回答的问题包括:
你应该从最坏的情况来考虑。但是,如果最坏的情况很少,并且平均情况的运行时明显更快,那么你还应该提到这一点。
这可以是你对数据结构的选择,算法的选择,循环配置的选择。准备好解释你的思考过程。
如果问题需要遍历输入中的每个元素 (假设输入没有排序,需要找到最大的元素),那么你很可能无法比 O(n) 更快。否则你很可能无法比 O(logn) 更快。
如果面试官问这个问题,答案 通常 是肯定的。在断言你的算法是最优的时候要小心 —— 不要轻易使用绝对的形容。
如果面试还有剩余时间,你可能会被问到一个全新的问题。在这种情况下,从步骤 2(问题陈述)重新开始。但是,你也可能会被要求对你已经解决的问题进行跟进。面试官可能会引入新的约束,要求改进空间复杂度,或任何其他数量的东西。
这部分是为什么真正理解解决方案而不是仅仅记住它们很重要的原因。
面试官通常会在面试结束时留出几分钟的时间让你问一些关于他们或公司的问题。在这一点上,很少能改善面试的结果,但你肯定能让它变得更糟。
面试是双向的。你应该利用这段时间来了解这家公司,看看你是否愿意在那里工作。你应该在面试前准备一些问题,比如:
所有的大公司都会有自己的科技博客。展示你对这家公司感兴趣的一个好方法是阅读一些博客文章,并编制一个关于公司为什么做出这些决定的问题清单。
保持兴趣,保持微笑,倾听面试官的回答,并提出后续问题,以表明你理解他们的答案。
如果你没有高质量的问题,或者表现得无聊或不感兴趣,这可能会给面试官一个不好的信号。如果面试官最后不喜欢你,你在技术方面做得再好也没用。
以下是「面试的阶段」一文的摘要。如果您进行远程面试,您可以打印此浓缩版并在面试期间将其放在您面前。
第一阶段:介绍
第二阶段:问题陈述
第三阶段:头脑风暴 DS&A
第四阶段:实操
第五阶段:测试 & debug
第六阶段:解释和跟进
您应该准备回答的问题:
第七阶段:结尾
阅读量:2034
点赞量:0
收藏量:0