终于把Google的面试给搞完了,感觉可以算是Tech Interview的顶峰了。这里主要写一下大概流程和内容,给大家以后interview一个参考。
G的full time面试一般3个,2个phone+1个onsite。到我这儿只有1个phone的,原因不太清楚,可能是他们急着招人,也可能是Waterloo Master的牌子,反正少一个我也乐的省心。从开始递简历开始到email接触到最后onsite完差不多快2个月。这个速度似乎在大公司里面算快得了,反正至今MS啊Amazon啊这些都还没理我……
先说说所有用到的知识点吧。Google的面试题总结起来2个词:宽!深!覆盖的知识面之广,基本把我知道的全给挖出来了。然后最后都会考到很难很难的点上,杀个几百万脑细胞。总的来说,我面试用到了以下所有的东西
Data Structure:
- Linked List
- Tree / Binary Search Tree
- Vector / ArrayList
- Queue & Stack
- Heap
- Stream (以前完全没用过这种东西啊!!!!)
Algorithm:
- Output Sensitive Algorithm
- Dynamic Programming
- String Matching / Auto-Completion
- Merge of Sorted Lists (2 or more)
- Random Generation
- Avg. and Wostcase Runtime / Space Analysis
Others:
- Polymorphism
- Design Patterns
- Huffman Optimization (这个都快忘了)
- Architechture Design
- Exception and Handling (这个完全给跪了)
基本就这些了。有些东西真的是太久没见过,都忘了。还有些东西想都没想过。Onsite最后一个人一上来问说:Suppose I dereferenced a random pointer in C++ program, and then I got an error and back to OS, can you tell me what happened there? 我当时整个人都囧了,这NM简直是结合了Complier, Exception和OS等多个方面的问题,太综合了点吧!
总的来说,一般都会有好几个面试官,然后每个面试官喜欢出写跟自己这在做的工作相关的。第一个面试官是搞Speech-to-text的,然后就问了两个word auto complete的问题。然后着重问了些设计上的细节,比如说哪个地方用那种data structure; search的时候用什么algorithm。后面还有面试官直接说“我现在正在用一个神马神马东西,你帮我设计一个”之类的。当然,也可能跟resume有关。我resume上面写了好几个project,碰到类似部门的面试官就会先问我写这方面的问题。
以前看到过很多人说这种tech interview会让你手写code,然后R和YJ也告诉我会写一堆code。本来我蛮紧张的,怕给个难题写出来一堆bug。结果发现,会让你写code的肯定都是简单的题啊!总共写了4段code:
- Find mininum element in a linked list
- reverse a linked list
- merge multiple sorted linked lists.
- check if there is a cycle in a linked list
这4个的code大二的学生就会写了有没有!前三个我们学校大一就会学有没有!其实我觉得这种code就是考你个基本功,看你是不是会一种编程语言。真正考人的地方还是在后面设计和算法上面,重点还是看你的思考能力。面试官想看到的是,当给你一个你们见过的问题时,你会怎么处理。
下面说说面试流程。先说电话面试吧。网上都说电话面试的时候会先问点behaviour question,来缓解一下紧张的气氛。关于这点,我只能说:呵呵~。我电话面试就是:hi Wendell? OK, Let's start. Tell me some detail you did in this project...说好的behaviour question呢?这简直是直入正题,连寒暄都没有!
算上onsite的4个面试官和1个电话面试官,我见过5个面试官。有三个开头是tell me about a project you did (or this project on your resume)。所以说做一些这方面的准备还是很重要的。还好我对自己做得东西还算熟,加上像AI的project专业性比较强,可以没事儿吐几个貌似很高深的专业词汇,装装B还是可以的。建议大家以后面试的时候准备1,2个这种Project,被问到的几率还是蛮大的。
如果开篇没问这些,就是直接进入正题了。一般来说,都会问个问题,然后问你怎么解。如果是个简单的问题,会让你写code。如果是比较困难的问题,多半是不会写code的,而你也会花大多数时间解释。比较经典的流程是给个问题,然后问can you improve this。我现在听到这句话都想死有木有啊!!!因为除非你能给个formal proof说没有更好的算法了,不然面试官会一直问到死啊!当然,另外一点就是what is the runtime。其实这个一般不是很难,但有时候面试官会让你用固定的变量,比如我面试的时候把一个词典做成了prefix tree,然后面试官让我把retrive a subtree的runtime和词典里词的数量联系起来,当时分体的我个蛋疼。当然,还有些时候会让你分析space,还有些时候是worst case and average case……总而言之,建议大家多作这个的练习吧,肯定跑不掉的。
最后说一下,有些面试官会很贱的误导你!我最后一个面试,那个面试官特别拉风,右边脸颊和脖子上有纹身,然后右手背上纹了个“独”字,左手背上纹了个“孤”字。问了我一道random generation的东西,然后试着误导我,说:我给你个提示,你可以这样这样,你不觉得很有用吗?然后我看半天不知道怎么接下去,因为出来的东西都是不对的!最后他告诉我,其实这道题测的是看你会不会让这个random的几率不平均。我擦,还好我是学AI的,半只脚踩在stat上的,不然还真说不定被你匡进去了!
面试的最后,有时候会给你点问问题的时间。据说这个也是面试官看重的一部分。我的一般做法是,问问面试官什么team的,问问他们的产品,问问他们team和其他team的联系。我问过技术相关的地方,好些东西都有保密机制,问不出个啥,还容易尴尬,不如问些什么一星期开几次会啊,要给其他team合作时候怎么办啊之类的问题。
最后说说面试题目吧。其实Google的面试题是要求保密的,我也就不说太详细,也不放答案了,你们就当练习题做好了
- 给你个BST/Min-Heap,找第K小的数
- 前面说的4个linked list problem
- 用linked list编一个stack,除了push和pop,还有min(),返回stack里面最小的element
- 现在程序要merge n个sorted list,但list很长会花非常多的时间,那我怎样设计程序达到高效率
- 假设现在有很大量的数据,99%是8-bit integer,1%是64-bit integer,如何记录这个
- given a set of intergers,the range of the set is defined at [low,high] where low is the smallest nubmer in the set and high is the largest number in the set. randomly generate a number such that in (low,high) but not in the set.
- Given an array of integers, and a difference d, produce the longest arithmetic progression chain from the array with the given difference.
神啊,让Google给我个offer吧