|
|
面试第二家公司(Amazon)2012-12-3
此文章由 山水长青 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 山水长青 所有!转贴必须注明作者、出处和本声明,并保持内容完整
面试第二家公司(Amazon)
开始找工作没几天,突然在11月6日收到一封亚马逊(Amazon)人事部的邮件,说他们在多伦多的分公司正在招人,他们觉得我的技术背景符合他们的要求,想约我进行面试。亚马逊是一家美国的大公司,在电子商务方面应该算是全球的老大,而且这个公司的福利待遇是非常不错的,特别是今年扩张的速度非常快,原来的公司就有同事被挖到亚马逊了。我在北京的时候还接到过30多个电话,都是为亚马逊招人的。如果能够进入亚马逊,那可是最理想的选择了。本来我的策略是想面试一些小公司,积攒些面试经验,那样去大公司时,成功的机会才会高一些,可没想到大公司的机会先来了,不管怎么样,这一次我一定要全力以赴,不能放过这个好机会。
第一轮是人力资源部门的电话面试,时间是11月8日上午11点,大约持续了20分钟。电话里只问了一下过去的工作经历,为什么要离开上一家公司,是否有这边的工作许可,以及对自己的技术能力的评估等等。这轮面试很顺利的通过了,直接约了下一轮面试的时间。
第二轮是大约1个小时的电话笔试。就是在约定的时间,他们打电话告诉你题目,要求你在一个小时内实现,然后把完成的结果发给他们,他们会评估你编写的程序,来决定你是否进入下一轮面试。这一轮的时间是11月9日下午2点。来加拿大1个多月了,加上之前在北京的时间,我有2个月没怎么写程序了,很多编程的细节都有些忘了,但准备的时间只有1天多,而且我还不知道会要求用什么编程语言那,是Java,C++,还是SQL。这一天多的时间,我都用来做编程练习了。接到电话后,测试内容是给出一个整数的数组,比如[4,3, 2, 8],写程序生成一个新数组,长度和之前的一样,但其中的每一个元素是上一个数组中其他整数的相乘的结果,例如[4,3, 2, 8] -> [3*2*8, 4*2*8, 4*3*8, 4*3*2] -> [48, 64, 96, 24],完成后用邮件把编写的程序和性能分析报告发回给他们,编程语言可以自己选择。开始的思路是分别对数组的每一个整数分别计算,不过又觉得应该不会这么简单,突然想起以前遇到过类似的问题,可以把所有数组的元素相乘,然后得出一个结果,然后用这个结果除以每个数组中的元素,就得到想到的结果了,这样的效率更高。我决定用Java来编写,因为Java的API里有个BigInteger类,用那个计算还能防止整数溢出的问题。写完后,又测试了一下,结果是正确的,还有不到10分钟。打算检查了一遍就把结果发回去了。这一检查突然发现了一个问题,如果原始数组有一个元素是0的话,我的算法就会给出错误的结果。现在要改掉这个问题,恐怕时间不够了。压力一下就上来了,如果现在修改应该是没法在1小时内完成了,不改又肯定会影响评估结果,难道这次机会就要止步在这里了吗。最后心一横,先把现在的程序发过去,并写明已经发现了这个问题,然后解决问题之后再给他们发一次更新的版本,如果修改后的结果不被承认那也没办法了。修改后的版本超了10分钟。当时以为已经失败了,可意外的两天后收到了邮件通知,说上一次测试通过了,约我下一次直接到公司面试,地点在多伦多。这真是意外的惊喜。
第三轮是到多伦多进行面试。亚马逊在11月15日和16日两天在多伦多搞一个招聘活动,要求我这两天赶过去,可是15日下午还有一个RIM的电话面试,所以我约在16日下午。渥太华和多伦多距离大约450公里,为了防止交通问题影响这次面试,我15号晚上坐火车出发,这样在车上还可以准备一下面试题,在多伦多住一晚,调整好状态再去参加面试。在预约这次面试的时候,亚马逊的HR在邮件里告诉了我面试需要准备的技术问题,听起来不错,可实际上范围太大了,包括数据结构中的数组,链表,队列,栈,堆,哈希表,树和图,还有所有的排序算法,深度和广度遍历算法,面向对象设计,数据库设计,分布式计算,互联网知识,操作系统,这相当于要求我把大学专业课程重新学一遍。从接到第三轮面试通知开始,我就停下了搜索新的工作机会,全力以赴准备这次面试,不过时间还是不够,只复习了一小部分。亚马逊的办公楼在多伦多旁边的密市(MISSISSAUGA),属于大多伦多地区,离多伦多市中心大约30多公里,虽然叫密市,听起来像个单独的城市,其实也就相当于北京的一个区,他们在那里有一个很大的办公楼,进去以后,看起来像是新建立不久的办公楼,里面比较空旷,只有一半面积被用作办公位置,其他地方都空着。亚马逊的HR的态度很热情,还为我们这些参加面试的候选人准备了饮料,说尽量让大家调整到最后的状态。我们这几个来面试的竞争对手在等待的时候还相互聊了几句,有刚毕业的,也有工作很多年的,有意思的是有一个居然是甲骨文的,几个月以前我们还算是同事,而且我在北京的时候还给他所在的组投过应聘简历。填完了个人信息表,又等了一会,正式的面试开始了。当天总共有四轮面试,每次两个面试官,一个负责提问题,另一个好像是新人,跟着学习面试经验的。最具有挑战性的阶段终于到来了。
(第一轮)开始的问题比较简单,问什么是队列和栈,它们之前的区别是什么。接下来问我如何用栈来实现一个队列。这个问题我也知道答案,用两个栈就可以做到。然后他们又让我在白板上用笔直接写出实现的代码,这个我也做到了,不过有一个边界条件没校验,被面试官指出来了,而且我的书写比较乱,估计会被扣分。难度再进一步提高,面试官问我假设执行在队列上执行一百万次插入操作,然后执行取出数据操作,问我该怎么办。就是这个问题把我难住了,一般列队的实现都是用链表,根本不存在这个问题,可这次他们要求只能用栈来实现,在一百万次插入操作后,一旦要做取出操作,必须要把这一百万条数据从第一个栈导到第二个栈上,性能的确很差。我开始尝试多加几个栈来做辅助工作,试图提高效率,但这些方案都被面试官否定了,这一轮的面试最终就止步到这里了。结束的时候,我问面试官用什么办法能做到,他说建立一个后台的缓冲区可以做到。不过我还是不太明白,回去后上网查了半天,也没有找到好的解决方案。
(第二轮)考察是算法问题,给出一个整数的数组,比如(1,6,3,4,2,5),让我写一段程序把所有两个数和为7的组合找出来。我只给出了穷尽的方法,就是先从数组里取出所有两个数的组合,然后一个个相加,看结果是否为7。但接着面试官要求我对算法进行优化,我没能给出解决方案。
(第三轮)考察设计能力。让我现场设计一个国际象棋游戏,每完成一部分的设计,面试官就会再提出一些新的条件,比如实现吃对方棋子,实习两个玩家是通过网络聊天,还有如何实现与电脑对战等。我感觉基本实现了面试官的要求,但不知道他对我的印象如何。
(第四轮)考察算法和数据结构。让我实现用谷歌关键字搜索的智能匹配,比如在搜索框里输入Ca,如何得到前缀相同的其他单词,像Canada,Cat,Can等等。这个问题正好我复习了,是用一种叫Trie树的数据结构,不过我回答这个以后,又问我实现的时间复杂度和空间复杂度,这个我没有回答上来。
面试结束后,亚马逊的HR很客气送我出了公司,不过我的感觉告诉我,这次面试已经彻底结束了,不会再有好消息了。亚马逊这样的公司,只有所有的问题都回答得让面试官满意才有可能得到工作,我的失误已经很多了。果然,回去没过几天,就收到了亚马逊发来的拒信。
总结一下这次面试,我觉得自己基本算正常发挥,算法和数据结构不是我的长项,虽然做了准备,但在算法上提高还是需要时间的,况且我的复习已经覆盖到了两项面试内容(第四轮的Trie树和第三轮的吃棋子算法),已经很理想了。而且重要的是,在这一星期里,我已经尽了全力了,即使失败了也没什么遗憾的了。唯一的不应该是第二轮的问题,在三年前一次去微软的面试时被问到过同样的问题,当时没做出来,可是后来我却没把这个问题彻底研究明白,被同一块石头绊倒了两次。回到了渥太华以后,我把所有遇到的面试问题都记录下来,尤其是我没有回答上来的,并到网上去寻找解决方案,我要争取以后不会再被遇到过问题难住两次。
|
评分
-
查看全部评分
|