当前位置: 首页 > 科技观察

只有程序员才能看懂的面试宝典|如何在CodingInterview中取胜

时间:2023-03-21 01:54:23 科技观察

我刚开始做CodingInterview的时候,我喜欢的公司都忽略了我。现在回想那个时候,我发现自己完全没有任何准备就去面试了。虽然已经有很多关于编码面试的博客文章和书籍,但现在我作为面试官坐在桌子的另一边,我仍然可以看到很多人没有准备或准备不足就来参加编码面试。这就是我开始编写本指南的原因。在我刚毕业第一次面试的时候,一定很想有这样一个向导来指导自己。从现在开始,我将自己遵循本指南。这些年我在几家公司工作过,所以我的面试技巧得到了磨练,我的面试过程教会了我该说什么,如何准备,以及如何面试。在本指南中,您将了解面试、成功面试的六个步骤,以及我在检查数据结构和算法时的考虑因素。本指南不能保证您能找到工作,但可以帮助您给面试官留下最好的印象。免责声明:本文表达的观点完全是我自己的,与我现在或以前的雇主无关。面试过程本节概述了硅谷公司的面试过程。这只是一个介绍。您可以跳过它,稍后阅读。除了直接申请面试,一般来说,获得面试机会的途径有两种:现任雇主推荐,或者通过LinkedIn。虽然前者会更快、更受尊重,但后者可能是大多数候选人选择的路径。事实上,LinkedIn上每天都有数不清的招聘人员在撒谎。他们唯一的工作是寻找并联系可能会换工作的员工,因此请确保您的信息是最新的,并建立更多联系并邀请其他人认可您的技能并在您的个人资料中添加您拥有的技能,您从事的个人项目上,或对您所做的开源软件的贡献。最初的联系通常是通过电子邮件,然后招聘人员会打电话给您,了解您的技术背景。如果您的技能符合他们的要求,他们会安排电话面试,您可能会被要求在共享的在线文档中编写代码。然后你就会知道这个文档很可能没有任何代码补全和语法高亮功能。电话面试可以持续半小时到45分钟,如果你表现好,你会被邀请到现场面试。现在如果没有电话面试,或者除了电话面试,你可能还得去一个小的编程项目。现场面试包括几次面试,一般持续45分钟到一个小时。这些面试将与电话面试非常相似,只是问题会更难一些——尽管能够与面试官见面会有所补偿。现场面试几周后,所有反馈都应该得到审查,并做出雇用决定,无论是否雇用。如果你没有拿到offer,也要明白面试是一个随机的过程,需要运气,把它当作一种学习经历。你可能还记得布赖恩·阿克顿(Brian.Acton)的故事,他在Facebook和Twitter面试失败,后来成为WhatsApp的联合创始人。从理论上讲,您使用哪种编程语言并不重要,除非您正在面试需要特定语言的工作,例如iPhone开发人员或前端开发人员。我强烈建议您使用您面试的公司使用的编程语言之一进行编程(并练习面试问题)。#p#成功面试的六个步骤编程面试的目的是确定您的编程能力。一般来说,你会需要用编程来完成一个功能或方法,但有时,你会需要编辑一个类的定义,或者设计一系列相关的代码模块。无论哪种情况,都要有条不紊地处理问题并遵循以下六个步骤:首先,确保您理解面试官的问题。许多问题故意含糊或模棱两可。这时候,你可以要求面试官把问题说清楚,以确保你真正回答了面试官的问题。你的问题还有一个好处,就是给自己一些时间让你的头脑转动起来。使用一个或两个示例来确定问题的约束和要求(在现场采访时在白板上执行此过程,或在电话采访时在笔记本上执行此过程)。尝试使用中等大小的示例以涵盖一些特殊情况。如果你能想到一张可能相关的表格,就把它画下来。事实上,写下任何想到的东西都会有所帮助,因为它给了你一个视觉锚点,当你陷入困境或处于思考过程中时,可以随时返回。传达您的意见可能是最重要的一步。尝试让面试尽可能互动,面试官不知道你在想什么,让他们参与你的思考过程会让她给你一些有用的提示,让你不会走错方向。你的目标是在编写代码之前与面试官确认你的答案,你对答案的思考越清晰、越高效,你就会得到更好的即时反馈。通过应用以下技术找到答案:回想你遇到的类似问题以及它们是如何解决的,尝试各种算法(分而治之、贪婪、递归、排序等),将问题分解成更小的、可管理的块(这样你就可以得到相应部分的分数),最后把你列出的数据结构过一遍,因为有时候,只要想到正确的数据结构,你就可以给出正确的答案。在你问了面试官问题并向她解释了你的答案之后,就该开始编码了。请记住,在共享文档中编写代码时,您可以复制粘贴、写注释,然后返回完成骨架算法和功能。但是在白板上写代码就不一样了。它需要头脑清醒,需要你有管理白板空间的技能。如果幸运的话,现在当你开始在白板的左上角写字时,你应该对自己写的内容有一个很好的了解,并且你会想要确保你没有被阻塞面试官在您写下答案时的看法。花点时间让代码简洁漂亮,因为你的代码也会成为面试反馈的一部分。当你写代码的时候,大声解释你在写什么,这会让你的面试官更容易理解你的思路。最后,用不同的例子和特殊情况验证你的代码,逐行检查。这展示了您的思维过程,允许您检查小错误,并向面试官表明您的方法有效。如果你想要额外的学分,你甚至可以写下单元测试的代码!最后,和面试官聊聊你的回答在空间和时间利用上的复杂程度,然后结束整个面试。#p#TelephoneInterviewPromptQuestions电话面试值得一提,因为这是大多数人失败的地方。这部分是因为电话面试是招聘过程中的第一个真正障碍,但部分是因为这种形式容易出现沟通不畅且缺乏视觉提示,使其特别苛刻。电话采访有两个主要障碍。第一个障碍是在电话面试开始时,双方唯一能看到的是一份空白的共享文件。这会使面试官容易因缺乏非语言交流而过度补偿并急于在屏幕上交流。可悲的是,这很少能奏效。因此,当务之急不是专注于盯着你看的空白文档,而是首先理解和评估问题(即完成上述六个步骤中的前四个),同时通过让自己尽可能多地沉浸在面试中来弥补现实尽可能不在场(请记住,您正在与一位面试官通电话,他很容易被其他事情分散注意力[例如查看电子邮件])。电话采访的第二大障碍是同时在电脑上打字和在电话上聊天的后勤工作。你不必用一只手敲代码,用另一只手打电话,或者把手机调成免提,我建议你在电脑上使用谷歌环聊进行面试通话(你需要有一个谷歌语音号码,并在面试前测试一下)。您还可以使用头戴式耳机或耳机进一步减少接收不良并提高通信质量。算法+数据结构=程序如果您想知道为什么软件工程面试与日常编程不同,您可能有兴趣阅读Quora上的这个答案。最根本的原因是面试是考你的计算机技术基础,所以会很侧重于算法和数据结构,所以你可能需要练习一些面试题,让自己有解决面试题的心态。短期内,你能做的最好的准备就是买一块白板,通读一遍《程序员面试金典(Cracking The Code Interview)》,里面有很多很好的建议,还有很多面试问题和答案,可以帮助你找出问题所在,并匹配好的答案模式。请参阅本指南末尾的常见面试问题列表。当然,从长远来看,我们都会死去,所以我会保持简单,并介绍一些您绝对应该复习的关键概念。数组/字符串大多数数组和字符串是可以互换的。其实你会遇到的大部分字符串问题,只要了解数组就可以解决。考虑到这一点,您应该知道如何遍历数组,如何访问、转换和交换其中的每个元素,以及如何对它们执行各种设置操作。二分搜索可能比任何其他算法都更成为面试问题的核心(如果你曾经有过关于分类数组的问题,那么二分搜索可能应该是你答案的一部分),你绝对必须知道如何使用它。排序与数组密切相关,是排序算法。您不太可能会被要求重用排序算法,但您可能至少会知道如何在O(nlogn)时间内完成排序。但是你大概应该知道归并排序(mergesort)或者快速排序(quicksort)和基数排序(radixsort)的实现细节。动态数组/可递增数组动态数组可以根据需要调整自身大小,同时仍提供分时摊销持续时间访问。一个典型的做法是,当一个元素被添加到一个完全排列的数组中时,一个新的更大的数组就形成了,旧数组中的元素被复制到新数组中。你应该在面试中做一个动态数组。如果你得到一个非数组问题,但你需要在你的答案中使用像数组结构这样的数组,省去麻烦并使用动态数组代替。哈希图/哈希表/字典/哈希集来完美解决。它几乎肯定会在你的面试中出现,你应该了解它是如何工作的(散列函数的作用,如何解决冲突,何时调整大小,为什么)以及如何使用它们。链表链表问题在C和C++面试中最常见,因为它们是了解候选人是否理解指针的简单方法。但是这一点太初级太基础了,所以无论你用什么语言,你都应该从头开始懂得应用。而且由于大多数链表问题只是与遍历和删除和插入相关的众所周知的问题的变体,链表问题很容易准备,没有理由你不应该得到这部分标记。许多链表问题中使用的一个小技巧是慢/快指针技术。它的简单含义如下:用两个指针迭代生成一个列表,其中一个在另一个前面。fast模式下的指针可能是最前面的一个固定数(有助于判断链表是否有环,或者找到链表中的第k个元素),也可能跳过慢速指针经过的多个节点。点(例如,如果快指针的速度是慢指针的两倍,当它到达链表的末尾时,慢指针将位于链表的中间)。请注意,当面试官谈论链表时,他们通常指的是单链表,但无论如何你都应该问。堆栈/队列堆栈和队列通常是您用来解决问题的数据结构的一部分。您应该知道如何使用链表和数组来实现它们。追加两题:用两个队列实现一个栈,用两个栈实现一个队列。Trees/BinaryTrees/BinarySearchTrees(BST)/DictionaryTrees/Heaps你可能不会每天都看到树和图,但你很可能会在面试中遇到它们,所以你应该彻底了解这些数据结构。树的最一般定义是与其他节点没有关系或与其他节点有不止一种关系的节点集合,但实际上,当面试官说“树”时,他们指的是二叉树。二叉树是一种树,其中每个节点最多有两个子树,通常称为左子树和右子树。不要将二叉树与二叉搜索树混淆,二叉搜索树是一种特殊的二叉树,其左子树节点的值小于其父节点,其右子树节点的值小于其父节点。父节点大于或等于。二叉搜索树的优点是,如果树的结构比较平衡(问面试官这个问题),那么查找、插入、删除都可以在O(logn)时间内完成。二叉搜索树的另一个重要性质是,可以通过遍历所有左子树得到树上最小的元素,通过遍历所有右子树可以得到树上最大的元素。请注意,有多种方法可以使树保持平衡,最常用的方法是红黑树和AVL树。它的具体实现细节我就不去研究了,只知道有这些数据结构。但是你绝对必须知道树的遍历算法:广度优先搜索、深度优先搜索,以及中序、后序和前序遍历之间的区别。不同之处。下面是Java实现中序遍历的例子,可以打印出一棵树的所有值(前序遍历和后序遍历几乎一样):voidinOrderTraversal(Noderoot){if(root==null)返回;inOrderTraversal(root.getLeft());//用值做一些事情System.out.println(root.getValue());inOrderTraversal(root.getRight());}trie(读作“树”)常用于字符串问题,它是一棵n叉树,除根节点外的每个节点代表一个字符或部分或完整的词,沿着树的每条路径代表一个词。其实它真的没有听起来那么复杂,只需阅读有关如何构建一个trie以及如何查询其中的值的维基百科页面。请注意,您可以按预定顺序遍历输出trie中的所有键。作为练习,考虑如何使用尝试实现自动完成。最后,堆,也称为优先级队列,是您应该了解的最后一个数据结构。它们通常是满足堆性质的二叉树:每个节点的子树的值小于节点本身的值,或者等于它。所以根节点的值永远是最大的,也就是说你总能找到最大值,但是代价就是找到任何其他值所需要的时间是O(n)。插入和删除所需的时间仍然是O(logn)。有向图/无向图/加权图与树相同。图也是由具有子集的节点组成的,但与树不同的是,这些节点可以有多个父节点,因此它们可能形成自环或循环。除了链接——也称为边——两个节点之间可能有比指针更多的信息,可能还有值和权重。有向边的图称为有向图,只有双向指针的图称为无向图。边上有权重的图称为加权图。图的表示方式有3种,但你只需要弄清楚邻接矩阵和邻接表就可以了。您应该了解它们的计算复杂程度、它们需要的权衡以及如何在实际代码中实现它们。使用哪一个取决于您拥有的图表类型,例如一个完全连接的简单图可以用邻接矩阵更好地表示,而稀疏图可以用邻接表更好地表示。请注意,如果您要实现加权图,您很可能需要定义一个Edge类。图论是一个非常广泛的话题,所以很难知道面试时应该熟悉多少图论算法,所以我只列出了我认为会涵盖90%图论问题的内容:YouabsolutelymustknowHowtotraversea图(深度优先或广度优先),以及如何进行拓扑排序,你应该知道如何实现Dijkstra的最短路径算法(这里有一个制作精美的视频解释了这个算法),而且还知道如何实现Prim的算法。最后,如果你也知道如何实现A*搜索算法就更好了。#p#其他数据结构使用上面的数据结构,你可能会解决大部分问题,不过欢迎大家在本栏目下方留言,为其他读者推荐其他数据结构。位运算要使用位,您必须首先了解数字在二进制补码表示法中的表示方式-二进制补码与未格式化的二进制表示法相同,只是负数被“咬”了。翻转后加1”,比如要得到数字-1,就得从1开始,即8位二进制整数00000001。每一位翻转后的结果是11111110,加上1就是11111111,就变成了——补码中的1。左移运算符“<<”将位向左移动,移动后的空位用0补上。右移运算符“>>”会将位模式右移,但在右移负数时,其效果在不同的编程语言中是不同的。在Java中,将右移进行符号扩展的方法是用1补负数中的空位。逻辑右移运算符“>>>”是Java和Javascript独有的,无论值是什么,它都会用0填充空白。设置位:可以使用按位或运算符(|)。数|=1<n时,没有对应的组合。否则,k个元素的组合数可以用下式表示:当k<=n时,从n个元素的集合中选取k个元素的组合数的通用公式。Concurrency并发问题在面试中并不常见,但它已经发生了,所以你肯定不想毫无准备,所以让我们来看看如何产生线程、使用同步和锁定对共享资源的访问,并了解什么会导致死锁的几种情况。准备本主题的一个好方法是制作您最喜欢的数据结构的同步版本。面试中的行为做好功课,了解你正在面试的公司、你自己以及你想去那里的原因。了解公司在做什么,你的新工作涉及什么,以及它最让你兴奋的是什么。换工作是一件大事,所以要认真对待并提前做一些研究。保持乐观。保持心情愉快,微笑,不要谈论你现在或以前工作的负面事情,在描述挑战时,保持乐观的语气并强调你从中学到的积极事情。这篇文章是上一篇说不要向面试官传递负面信息的必然结果。有的面试官会问你现在感觉怎么样,别说以前受不了一两个面试官,就说一切都很好。充满激情!让您的兴奋闪耀,展示您对软件开发、技术和解决重大问题的热情。去问问题。对你的面试官每天都在做的事情真正感兴趣,询问他们在工作中遇到的机会和挑战,提前准备一些程式化的问题,表现出你对公司和职位的兴趣。但无论你做什么,都不要问“你感觉如何”?首先,您可能会收到相同的程式化答复,其次,让面试您的人处于那个位置并不是一个好主意。保持亲密并关闭循环。当你完成面试后,给招聘人员发一封简短的感谢信,让他们知道你对这次面试的感受。回想一下你学到了什么。无论结果如何,您都可以学到一些东西——可能是知识上的差距,或者是一个新的面试问题——所以要自我反省并从自己的经验中学习。祝你的事业和面试好运!来源:简书原文:https://medium.com/@declercq/how-to-crush-the-coding-interview-1fc8a4695d7c作者:StefanDeClercq翻译:http://www.jianshu.com/p/d34c335a6cfd/comments/766555译者:Nextoffer