4、通过应用以下技巧来找到答案:回想一下你遇到的类似问题,再想想它们是如何被解决的,尝试各种不同的算法(分治算法、贪心算法、递归、排序,等等),把问题分解成更小的、可处理的小问题(这样你就能得到相应部分的分数),最后再通览一遍你列出的数据结构,因为有时候,只要想到了正确的数据结构,就能给出正确的答案。
5、当你向面试官问清楚了问题、并向她解释了你的答案之后,就可以开始写代码了。要记住,在共享文档里写代码的时候,你可以复制粘贴、写评论,而且能回过头来完成骨架算法和功能。但在白板上写代码就不一样了,它需要你的头脑很清醒,而且需要你具备管理白板空间的技能。如果足够幸运的话,现在当你开始在白板左上角动笔的时候,应该非常明白你要写些什么东西,而且你要确保在你写答案的时候,没有挡住面试官的视线。花点儿时间把代码写得紧凑而美观一点儿,因为你的代码也会是面试反馈的一部分。在你写代码的时候,要大声解释你在写什么,这会让你的面试官更容易地跟上你的思路。
6、最后,用不同的例子和特殊案例验证一下你的代码,并且要一行一行地过。这会展示你的思考过程,让你检查出小错误,并告诉面试官你的办法是可行的。如果你想得到额外加分的话,甚至可以把单元测试的代码写下来!最后再和面试官聊一下你的答案在空间和时间利用方面的复杂性,然后结束整场面试。
电话面试中提示出的问题电话面试值得特别一提,因为这是大多数人失利的地方。之所以会这样,部分原因在于电话面试是招聘过程中第一道真正的关卡,但也有一部分原因在于,这种形式容易造成沟通的错误,而且缺乏可视化线索,所以电话面试是特别严酷的。
电话面试有两大障碍。第一大障碍是,在电话面试的一开始,双方都能看到的唯一的东西就是一个空白的共享文档。这会让面试者倾向于过度补偿非语言沟通的缺失,从而着急忙慌地在屏幕上进行沟通。令人遗憾的是,这么做很少会有好结果。所以当务之急并不是去关注那个正在盯着你的空白文档,而是要首先理解和评估问题(也就是完成上述六个步骤中的前四个),同时通过尽可能地沉浸到面试中来弥补现实存在感的缺失(要记住,电话的另一头是一位可以很容易就被别的事情[比如查看邮件]分心的面试官)。
电话面试的第二大障碍,就是要同时在电脑上打字和在电话上聊天的后勤保障问题。你不必一只手敲代码、一只手打电话,也不必把电话调到扬声器模式,我建议你用电脑上的Google Hangouts接面试电话(你得有一个GoogleVoice号码,而且得在面试前测试一下)。你还可以用耳麦或者耳机来进一步降低不好的接收效果、提高沟通质量。
算法+数据结构=程序 如果你正在思考为什么软件工程的面试和日常编程不一样,那你可能有兴趣读一下Quora上的这条回答。最根本的原因在于:面试是为了测试你在计算机技术方面的基础,所以会非常偏重算法和数据结构,因此你可能需要练习一些面试问题,从而让自己具备解决面试问题的心态。
从短期来看,你所能做的最好的准备工作就是买一块白板,并通读一遍《程序员面试金典》(Cracking The Code Interview),里面都是很好的建议,而且里面的许多面试问题和答案会帮助你确定问题所在,并匹配好回答模式。请参阅本指南最后列出的常用面试问题。
当然了,长远来看,我们都会死掉,所以我会把事情搞简单,说一些你绝对应该复习一下的关键概念。
数组/字符串大部分数组和字符串是可互换的,事实上,你遇到的大部分字符串处理的问题,都可以在理解数组的基础上得到解决。记住这一点之后,你应该懂得如何遍历数组,知道如何访问、转换和调换其中的每一个元素,而且要懂得如何对它们进行各种不同的集合运算。和其他算法相比,二分法检索(Binary search)可能会更多地成为面试问题的核心内容(如果你曾经碰到过有分类数组的问题,那么二分法检索有可能应该是你答案的一部分),你绝对必须知道如何使用它。
排序和数组密切相关的,是排序算法。你不大可能会被要求重复使用一个排序算法,但很可能你至少知道排序是如何在O(nlogn)的时间里完成的就行。不过你应该大概知道归并排序(merge sort)或者快速排序(quicksort)和基数排序(radix sort)的执行细节。
动态数组/可增数组 动态数组可以按需重新调整自己的大小,同时依然提供分时平摊的持续时间访问。一种典型的做法是,当在一个全排列数组中增加一个元素的时候,会形成一个新的、更大的数组,而旧数组中的元素也会被复制到新数组里。你应该在面试时做到完成一个动态数组。
如果你拿到一个非数组类问题,但你在答题中需要用到像数组结构这样的数组,不妨少给自己惹麻烦,直接用动态数组吧。