在编写代码面试之前应该做什么

  • 穿着舒适。

    通常不需要穿西装打领带,休闲装就可以了。T恤和牛仔裤在大多数地方都是可以接受的。

确保你已经阅读并准备了自我介绍以及最后的问题要问

对于虚拟现场编码面试

  • 准备笔和纸。

    如果你需要记录和可视化内容,绘制图尤其有助于解决树/图问题。

使用耳机或耳机,并确保你处于安静的环境中。

避免使用扬声器,因为如果回声很大,沟通会更困难,参与者重复自己的话只会浪费宝贵的时间。

检查你的互联网连接是否正常工作。 检查你的网络摄像头和音频是否正常工作。 熟悉并在编码环境中设置快捷键(CoderPad / CodePen)。

设置编辑器快捷键,启用自动补全,制表符间距等。如果面试官看到你知道快捷键并使用得很好,他们会印象深刻。

如果可能的话,关闭网络摄像头。

大多数远程面试不需要视频聊天,开启它只会分散注意力并占用网络带宽。

对于电话屏幕编码面试

  • 使用耳机,把手机放在桌子上。

    避免一只手拿手机,另一只手只能打字。

请求使用Zoom/Google Meet/Hangouts或Skype代替电话通话。

发送链接或文本更容易。

对于现场白板编码面试

  • 学习关于白板空间管理。

    在代码行之间留出空间,以防需要插入新行。

根据您提供的Markdown技术文档内容,以下是翻译后的简体中文版本:

  • 如果你被给了一个单词字典,它是字符串列表还是前缀树(Trie)?

  • 输入数组是否有序?(例如,用于决定是二分搜索还是线性搜索)

  • ✅ 明确输入值范围。

    输入:有多大数据量以及范围是多少?

  • ✅ 明确输入值格式

    值:负数?浮点数?空值?空值?重复值?极大值?

  • ✅ 通过简化示例来确保您理解了问题。

    例如,要求编写回文检查器,在编码之前,想出简单的测试用例,如"KAYAK" => true, "MOUSE" => false,然后与面试官核对这些示例是否符合他们的期望

  • ❌ 在面试官给出您可以开始编码的绿灯之前,不要立即跳入编码。

3. 与面试官一起制定并优化您的解决方案

接下来最糟糕的事情就是直接跳转到编码上——面试官期望在讨论正确解决问题的方法上有一些时间,包括时间和空间复杂性的分析。

这个讨论可以根据问题的复杂性从几分钟到最多5-10分钟不等。这也给了面试官一个机会向你提供指导,帮助你朝着可接受的解决方案前进。

  • ✅ 如果您在方法或优化上遇到困难,请使用这种结构化的方法来唤起您的记忆/找到一个好的方法
  • ✅ 高层次地解释几种您可能采取的方法(不要过多涉及实现细节)。就像面试官是您的同事,你们都在合作解决问题一样,与面试官讨论每种方法的权衡。

对于算法问题,空间/时间是常见的权衡。以著名的Two Sum问题为例。有两种常见的解决方案:

  1. 使用嵌套的for循环。这将花费O(n2)的时间复杂度和O(1)的空间复杂度。
  2. 在数组的一次遍历中,您将一个值映射到其索引到哈希表中。对于后续值,查找哈希表以查看是否可以找到一个现有的值,可以与目标值相加。这种方法的时间和空间复杂度都是O(N)。讨论两种解决方案,提及权衡,并得出哪种解决方案更好的结论(通常是用较低的时间复杂度的解决方案)
  • ✅ 陈述并解释您提出的方法的时间和空间复杂度。

    提及时间的大O复杂度,并解释原因(例如O(n2)的时间复杂度是因为有嵌套的for循环,O(n)的空间复杂度是因为创建了一个额外的数组)。使用算法优化技巧掌握所有时间和空间复杂度。

  • ✅ 就最理想的方法达成一致并对其进行优化。识别重复/重叠/重叠的计算,并通过缓存减少它们。参考页面优化您的解决方案
  • ❌ 在面试官给出您可以开始编码的绿灯之前,不要立即跳入编码。
  • ❌ 不要忽略给出的任何信息。
  • ❌ 对于您的方法或分析不要显得不确定。

4. 在讲述的同时编写代码

  • ✅ 只有在您解释了方法和面试官给了您绿灯之后才开始编码。
  • ✅ 解释您正在尝试实现的目标,同时编写代码/书写。在相关的地方比较不同的编码方法。

    通过这样做,展示您选择的编程语言的掌握程度。

  • ✅ 编写/书写速度要合理,以便您可以讲述它 - 但不要太慢。

    您需要键入足够慢,以便您可以解释代码,但不至于太慢,以免耗尽回答所有问题的时间

  • ✅ 尽可能编写实际可编译、可运行的代码,而不是伪代码。
  • ✅ 写出干净、直接、整洁的代码,尽量减少语法错误/bug。

    总是选择更干净、更直接的实现而不是复杂的、混乱的实现。确保您采用整洁的编码风格和良好的编程实践,按照语言范式和构造。尽可能避免语法错误和bug。

  • ✅ 使用能解释代码的变量名。

    良好的变量名很重要,因为您需要向面试官解释您的代码。最好使用能够自我解释的长变量名。假设您需要在数字数组中找到3的倍数。将结果数组命名为multiplesOfThree而不是数组/数字。

  • ✅ 请求在不实现的情况下使用平凡函数。

    例如reducefilterminmax都应该可以使用

  • ✅ 以模块化的方式编写代码,从高级函数开始,然后将它们分解为较小的辅助函数。

    假设您被要求建造一辆车。您可以首先写几个高级函数:gatherMaterials()assemble()。然后分解assemble()为较小的函数,makeEngine()polishWheels()constructCarFrame()。您甚至可以询问面试官是否可以不编写一些平凡的辅助函数。

  • ✅ 如果您在代码中偷工减料,向面试官说明,并说明在非面试设置下会怎么做(没有时间限制)。

    例如,“在非面试设置下,我会使用正则表达式解析这个字符串,而不是使用split(),后者可能无法覆盖某些边缘情况。”

  • ✅ [现场/白板] 练习白板上的空间管理
  • ❌ 当面试官在说话时不要打断他们。通常如果他们在说话,他们是在给你暗示或者引导你朝着正确的方向前进。
  • ❌ 不要花太多时间写注释。
  • ❌ 不要重复自己
  • ❌ 不要用不好的变量名。
  • 不要用极其冗长或单字符的变量名,除非它们很常见,比如in
  • ❌ 不要复制粘贴代码而不检查(例如,粘贴后可能需要重命名一些变量)。

5. 编码后,检查代码并添加测试用例

一旦你完成编码,不要宣布结束。面试官希望你开始寻找错误并添加测试用例来改进你的代码。

  • ✅ 浏览代码以查找错误 - 例如偏移量错误。

    用一双新的眼睛阅读你的代码 - 就像你第一次看到别人写的代码一样 - 并讨论你发现错误的过程

  • ✅ 与面试官一起头脑风暴边缘情况,并添加额外的测试用例。(参考算法备忘单了解常见的角落案例)

    给定的测试用例通常按设计简单。头脑风暴可能的边缘情况,如大型输入、空集、单元素集、负数。

  • ✅ 使用这些测试用例逐步运行你的代码。
  • ✅ 寻找可以重构的地方。
  • ✅ 重申你的代码的时间和空间复杂度。

    这让你提醒自己注意代码中可能偏离原始时间和空间复杂度的潜在问题。

  • ✅ 解释权衡,以及如果给予更多时间,代码/方法如何改进。
  • ❌ 不要立即宣布你完成了编码。首先进行上述操作!
  • ❌ 不要与面试官争论。他们可能是错的,但鉴于他们熟悉这个问题,这是非常不可能的。

6. 面试结束时,留下良好的印象

  • ✅ 提出适合公司的良好最终问题。

    阅读提示和可问的最终问题样本

  • ✅ 感谢面试官
  • ❌ 在没有提出任何问题时结束面试。

编码面试后做什么

总结编码面试后应该做什么
编码面试后应该做什么
  • ✅ 记录面试问题和答案,因为这些可能对未来的参考有用。
  • ✅ 发送一封跟进邮件或领英邀请给面试官,感谢他们的时间和面试机会。

    作为面试官,这些可以给我留下持久的印象。