正文
这会展示你的思考过程,让你检查出小错误,并告诉面试官你的办法是可行的。如果你想得到额外加分的话,甚至可以把单元测试的代码写下来!最后再和面试官聊一下你的答案在空间和时间利用方面的复杂性,然后结束整场面试。
电
话
面
试
中提示出的
问题
电话面试值得特别一提,因为这是大多数人失利的地方。之所以会这样,部分原因在于电话面试是招聘过程中第一道真正的关卡,但也有一部分原因在于,这种形式容易造成沟通的错误,而且缺乏可视化线索,所以电话面试是特别严酷的。
电话面试有两大障碍
。第一大障碍是,在电话面试的一开始,双方都能看到的唯一的东西就是一个空白的共享文档。
这会让面试者倾向于过度补偿非语言沟通的缺失,从而着急忙慌地在屏幕上进行沟通。令人遗憾的是,这么做很少会有好结果。所以当务之急并不是去关注那个正在盯着你的空白文档,而是要首先理解和评估问题(也就是完成上述六个步骤中的前四个),同时通过尽可能地沉浸到面试中来弥补现实存在感的缺失(要记住,电话的另一头是一位可以很容易就被别的事情[比如查看邮件]分心的面试官)。
电话面试的第二大障碍,就是要同时在电脑上打字和在电话上聊天的后勤保障问题。
你不必一只手敲代码、一只手打电话,也不必把电话调到扬声器模式,我建议你用电脑上的Google Hangouts接面试电话(你得有一个GoogleVoice号码,而且得在面试前测试一下)。你还可以用耳麦或者耳机来进一步降低不好的接收效果、提高沟通质量。
算法
+
数
据
结
构
=
程序
如果你正在思考为什么软件工程的面试和日常编程不一样,那你可能有兴趣读一下Quora上的这条回答。最根本的原因在于:面试是为了测试你在计算机技术方面的基础,所以会非常偏重算法和数据结构,因此你可能需要练习一些面试问题,从而让自己具备解决面试问题的心态。
从短期来看,你所能做的最好的准备工作就是买一块白板,并通读一遍《
程序员面试金典
》,里面都是很好的建议,而且里面的许多面试问题和答案会帮助你确定问题所在,并匹配好回答模式。请参阅本指南最后列出的常用面试问题。
当然了,长远来看,我们都会死掉,所以我会把事情搞简单,说一些你绝对应该复习一下的关键概念。
数组/字符串
大部分数组和字符串是可互换的,事实上,你遇到的大部分字符串处理的问题,都可以在理解数组的基础上得到解决。记住这一点之后,你应该懂得如何遍历数组,知道如何访问、转换和调换其中的每一个元素,而且要懂得如何对它们进行各种不同的集合运算。和其他算法相比,
二分法检索
可能会更多地成为面试问题的核心内容(如果你曾经碰到过有分类数组的问题,那么二分法检索有可能应该是你答案的一部分),你绝对必须知道如何使用它。
排序
和数组密切相关的,是排序算法。你不大可能会被要求重复使用一个排序算法,但很可能你至少知道排序是如何在O(
n
log
n)
的时间里完成的就行。不过你应该大概知道
归并排序
或者
快速排序
和
基数排序
的执行细节。
动态数组/可增数组
动态数组可以按需重新调整自己的大小,同时依然提供分时平摊的持续时间访问。一种典型的做法是,当在一个全排列数组中增加一个元素的时候,会形成一个新的、更大的数组,而旧数组中的元素也会被复制到新数组里。你应该在面试时做到完成一个动态数组。
如果你拿到一个非数组类问题,但你在答题中需要用到像数组结构这样的数组,不妨少给自己惹麻烦,直接用动态数组吧。
哈希映射/哈希表/词典/哈希集合
哈希表
是编程时的瑞士军刀,很多不同类型的问题(检查存在、计算频率、排序,等等)都能用哈希表来完美解决。它几乎肯定会出现在你的面试中,而你应该理解它的原理(哈希功能的角色、冲突如何解决、什么时候要调整大小、为什么)以及如何运用它们。
链表
链表问题在C和C++的面试中最常见,因为它们是弄清楚应聘者是否理解指针的一种简单的办法。不过这个点太初级、太基础了,所以不管用哪种语言,你都应该知道该如何从零做起应用它们。而且由于大部分链表问题不过是与人所周知的遍历还有删除和插入相关的问题的变体,所以链表问题准备起来很容易,你没有理由拿不到这部分分数。
许多链表问题中都会用到一个小技巧,那就是慢速/快速指针技术。它的简单版含义如下:使用两个指针迭代生成一个列表,其中一个指针在另一个指针的前面。快速模式下的指针可能会是一个位于前面的固定数值(它有助于确定列表有无循环,或者找到列表中的第k个元素),或者也可能会跳过慢速指针经过的多个结点(打个比方,如果快速指针的速度是慢速指针的两倍,那么当它到达列表末尾时,慢速指针将会位于列表的中间)。
请注意,当面试官谈到链表时,他们常常指的是单链表,但你无论如何都应该问清楚。
栈/队列
栈和队列一般会是你用来解题的数据结构的一部分。你应该知道如何用链表和数组两种方式来实现它们。
加练两道题:利用两个队列实现一个栈,以及利用两个栈来实现一个队列。
树/二叉树/二叉搜索树(BST)/字典树/堆
你可能不会每天都见到树和图,但你很可能会在面试时遇到它们,所以你要彻底地看一下这些数据结构。
树最一般的定义,是和其他结点没有或者有一个以上关系的结点的集合,但在实践中,当面试官说“
树