第一轮电话面试(一小时):
(第一次电话面试,面试前有点紧张,但是和面试官聊了几句就完全放松了)让我给他介绍做过的ACM比赛的经历,然后一道算法题:给你一个股价序列,告诉你每个时间点的股价,问你什么时候买什么时候卖获利最大。我想了个时间空间复杂度都为O(n)的算法(瞬秒),没想到很囧的是他让我通过电话给他念代码。。。最后让我在电话挂断后把代码发给他。
第二轮电话面试(一小时):
先是英文自我介绍,然后让我介绍一个做过的印象最深的项目,然后就问我这个项目是怎么设计的,遇到了什么困难怎么解决的,最后是两道算法题:(1)有0,1,2到99这100个正整数,中间丢失了一个,剩余的99个数打乱顺序放在一个数组里,问怎样找到丢失的那个数。他没有要求复杂度,结果我就没往深处想,直接说了一个时间空间复杂度都为O(n)的算法(瞬秒),他说ok,然后第二题(事后想想当时脑残了,能把空间复杂度优化到O(1)的,不过对方当时没问)(2)有一个有序的环形数列,从小到大排好了,比如:4,5,6,1,2,3,从第四个位置开始当成环形看,就是一个有序数列1,2,3,4,5,6。问题是在这个数列中找到给定的关键字。我想到了用二分找到这个环形的开头位置i,那么[0,i],[i+1,n-1]就是有序的,再次做二分即可。对方说能想到lgn的复杂度很好,但是希望能够只要一次二分就完成。我又纠结了一会才想到,正要跟他细说,但是他说“我相信你已经知道怎么做了,等会把代码发给我”。
现场面试(三轮,总共三个小时多):
第一轮经理面(两个面试官),很nice,一上来就亲切的说“挤地铁挺辛苦的吧”,聊了一会让我放松了一下心情才开始面。先是英文自我介绍加一个英文问答:Why Amazon?然后聊我做过的项目,问了点基础知识:数组、链表、map的区别和用法。一个算法题:最长公共子序列,我瞬间想到了动态规划(时空复杂度都是O(n^2)),果断ko,但是另一个面试官指出还有时间复杂度更低的算法,我就晕了
,跟他说动态规划的方法只能把空间复杂度降为O(n),时间复杂度降不下去了。他说有种数据结构叫做后缀数组,可以优化时间复杂度。
受打击呀,我只听说过可没有研究过,想想真是欠下的总是要还的呀。最后问了一个设计题:电影院售票系统,要求用面向对象的思想设计出这几个对象以及他们之间的关系。他还说估计你上大学没怎么去过电影院吧。。。于是帮我介绍了一下电影院售票的一些情况。我就给他设计了几个对象,两个面试官问了几个问题为什么这样设计、如果出现这种情况怎么办,还好我思路清晰,一一给他们解释了。
第二轮面算法和代码,面试官一上来和我聊我是住在学校里面还是外面,估计是怕我紧张想让我放松心情吧。问的题居然还是那道股价题。。。我就想Amazon怎么这么喜欢问股票呢,肯定是他们的股票一直再涨
。我跟面试官说我见过类似的题目,但他还是要求我给他说了思路并且写了代码,然后他说空间复杂度可以优化到O(1)的,给了我提示之后也ko了。然后他看时间充裕就又问了一道题:给一个n行m列的矩形框,每个格点都放着若干大米,小鸡从左下角点出发,只能往右或者往上走,问小鸡最多能吃掉多少大米。很简单的动态规划,瞬秒。然后他又和我讨论了优化空间复杂度的问题,我说可以从O(n^2)优化到O(n)的,对方表示满意。
第三轮是面试官和我讨论一个open question,这个题目感觉很有意思:给一个图片,这个图片是由n*m个小图片拼成的,它的色调是左上角最浅,越往右下角色调越深。问我有没有什么办法做出这样的图片。我的想法是对这n*m个小图片的色调从浅到深排序,然后斜着从小到大填充这个大矩形。
1 2 4
3 5 7
6 8 9
对色调排序是把每个小图片的RGB三个值(范围0~255)做统计,最后去掉个数过少的然后做加权平均,哈希出每个小图片的色调值然后再排序即可(没有标答,你可以自己定义规则,只要合理就行)。一边讨论一边让我把自己定义的数据结构、怎样找每个小图片的哈希值、怎样填充大矩形的代码写了下来。
感觉亚马逊的面试很规范,面试官都很nice,总是用各种方式让气氛活跃起来,不让被面试者感到紧张和压力,HR团队也是相当的专业,相当的nice,大赞~