因为之前是学算法的,mit算法书以前就看过两遍,基础还可以,前期8月份刷了遍leetcode。然后9月初投出简历。两个星期刷Careercup,最后面试期间一直查缺补漏。到现在尘埃落定大概两个月。最后GFR全挂,总结下惨痛经历:
Facebook电面面试官做distributedcacheinfrastructure的,先问我最难的project,没怎么好好准备过behavior,胡乱说了一通。但是因为做的是电路相关,非行内人士很难明白,讲的也比较乱。最后估计起到了反效果。感觉如果不是有特别好的经历和体会的话(特别对于fresh在校内没什么好相关项目经历的)这种最好长话短说想办法一笔带过,不然可能起到反效果。浪费了大几分钟开始第一题,leetcode原题,ValidPanlindromeAman,aplan,acanal:Panamaisapalindrome.这题之前做过,也很简单,但当时太紧张出了一个很sb的bug,还是在面试官提示下找到的。15行的代码出bug实在是不能犯的错误。另外在判断一个char是否letter的时候没有另用函数把一堆写了两次,被批评不够简洁。第二题,将1-2-3-4-5-6-7变成1-7-2-6-3-5-4,不能用额外空间第一遍用了recursive很快解决,被指出用了stack额外空间,开始改iterative,最后因为第一题浪费时间手忙脚乱没改完。说了一下大概思路草草收场,面完就知道不妙。4天后被通知挂了。总结:facebook非常重视coding的clean和bugfree。这两题都没什么算法但是如果coding不过硬第一遍很容易有bug,我感觉从这点上来讲面试官出题水品很高,死的心服口服。另外他家感觉比较看背景,phdonsite会有jedi面试问项目经验什么的,专业差太大估计要超级牛才容易过。
Google电面上来直接上题,题目有些绕。CSS里面表示颜色用#abcdef(eg0x1F2A3B)这种形式,每个字母代表四个bit(hex),两个字母代表一种原色比如ab=R,cd=G,ef=B现在需要压缩空间改#abcdef为#xyz实际上#xyz=#xxyyzz,所以减小一半,问怎么找到最好的压缩让(ab-xx)^2+(cd-yy)^2+(ef-z)^2最小这题其实数学上很简单因为三个维度是分开的,其实就是找#ab到#xx的压缩。我当时的面试官是个asian可能是韩国人或abc,有点bitchy。我最开始说让我想一想,才过了5秒钟他说不知道我在想什么让我在googledoc上打,然后我就在上面打example试图观察一下规律,他又阻止我说不用什么都打出来。完了我说了我的观察:a的权重更大,x应该很接近a,实际上x=a,a-1,ora+1。然后他不置可否。可能我说的不是很清楚,他又开始和我纠结我的变量名用得不好。因为他一直和我纠结这些细节,我也没法安心思考,直接就开始写code,又拿不准函数input和output应该用什么样的type和形式。这就是这种模糊提很麻烦的一个地方。面试官还是不给提示,我就开始写但是code写的很乱。中途面试官没有任何提示。完了我说想moveon到下一题他说没时间了要我找bug。整个code写的很糟,因为没有分情况按ab时x=a,a-1,ab时x=a,a+1这样来考虑所以变成了forloop非常乱。还剩5分钟时万念俱灰面试官问我还可以怎么optimize已经没心思回答了跟他说”如果你想让我检查代码我就看吧“开始有点顶撞他的意思。我电面这么多次第一次和面试官搞得这么僵心情非常沮丧。最后草草收尾。3天后通知被挂。心得体会:google电面其实是很松的,很容易过。电面没过打击很大,除了运气不好碰到面试经验不丰富的面试官和模糊题外主要问题还在自己。因为题目并不难,就算和面试官不和拍也应该避免干扰仔细思考认真写代码。特别是到后面十分钟我有点破罐子破摔,这样给面试官映像肯定非常糟糕。因为面试的一个目的就是考验你是riseagainstchallenge还是crashunderpressure。这点上我表现的非常失败。因为google家比较看中算法算是我的强项,所以没能去成onsite非常可惜。
RocketFuel网上交简历,当天收到hr回信,过两天和hr电话chat半个小时,主要问问背景和看你是不是seriousapplicant。完了发来onlinetest5hour。我做的autoracer。没有follow他的hints选了最优算法但是由于编不出balancedavltree有个testcase没过,还是个给了电面,面试官是三哥,电面是之前有人贴过的adquery题,给出了大家讨论的最优答案,又拓展到分布式系统。才说了半个小时面试官突然说时间到了问我有没什么问题,我看他很急就说没问题就bye了。本来以为肯定挂了因为预定要一个小时,结果过了两天recruiter说feedbackverypositive让我去onsite有点莫名其妙。onsite中午和一个cmu毕业的topcoder+的nbphd吃饭闲聊了一下,下午面了四个人,三个三哥一个asian。两个bigdatainfrastucture(最后端)的,两个servinginfrastrucre(中后端)的。所有题目在之前rocketfuel的帖子里或者leetcode都能找到,除了一道挺有意思的题给定一个n*n的board里面是0或1.算出里面独立0group的数量。比如
1答案是3个group。我瞬间给出了一个BFS的O(n^2)答案,被指出需要visited数组的额外空间。然后给了一个逐行扫描的算法相当tricky,我经过提示才想出来。面试完后第二天被告知挂了。其实自我感觉还不错除了javamultithreading答的不好。recruiter给的反馈是总体还不错但有人指出我codingabitmessy。说另外还有一个不错的candidate选了另外那个人,说我是prettyclose。我自己猜测如果不是因为另外一个人是三哥或美国人这种原因还是死在codingquality上,另外背景实在差的有点远。他家要求最好一遍写出cleancode。另外在onsite是建议code不要写太长,如果要超过一黑板最好把里面主要部件都先用函数代替写出主要流程向面试官说明之后补充即可。心得:onsite时因为很多题都见过经常迅速讲一下思路就开始coding,感觉交流不够。面试的时候交流还是第一位的,如果跑上来就写代码写的再好面试官对你印象也未必好(可能还会觉得你是练过的),因为他会把你当成未来的coworker所以交流的融洽是很重要的。rf家的bigdatainfrastructure全部是三哥,我觉得这也是我挂的一个原因,建议申请aioptimization那些核心组,那才是他们家的精髓所在。rf没有之前提的那些帖子那么乱但感觉还是不够正规,面试的时候不是很舒服,连schedule都不给你,说好的面试官经常换人。
总体心得coding不过硬会导致必然的失败。我之前就是觉得自己算法底子不错忽视了coding,其实本末倒置。工作中coding才是最重要的,而且看了很多牛人的coding之后才发现这个事情真的不是搬砖那么简单,同一个内容的程序coding好不好能差很多(再加上clear和readability的考虑)。顶尖it公司要的不是averagecoder而是topcoder,所以以前仗着算法不错就满足于average的coding水品实在是很幼稚,以后一定会在这方面加强锻炼。个人还有些算法和advanceddatastructure的重点觉得没有在leetcode里面很好体现的,总结如下:1.很多recursive容易的算法也要考虑iterative方法。因为掌握iterative代表你对问题结构理解上升了一个高度。e.g.reverselinkedlist,treetraversal2.i)topk(kth)elements:heapO(n+klogn),quickselectO(n)averageO(n^2)worst,medianofmediansO(n)worst.consandpros.Extension:whatifalldatacannotfitintomemory.heapsizeofkO(nlogk)forsinglemachine,manymachinessee3.ii)getmedianindatastream:maxheap+minheap3.kthelementinmanymmachines:binarysearch,pickapivotandseehowmanylessandlargeramongallmachines,thendiscardhalvesaccordingly(distributedquickselect)
ifsortedinsinglemachine:findsmallest(k/m)thelementamongallmachinesanddiscardthelesspartition.4.stacksupportO(1)getMinqueuesupportO(1)getMine.g.kslidingwindow,mostfrequentlyclickedurlinpast12months.5.reservoirsamplingforinfinitestream,generaterandom(1-7)withrandom(1-5),cardshuffle,stringpermuteinplace6.datastructurewithO(1)insert,delete,getRandom,get:hashmap+array
LRUdatastructure:hashmap+doublelikedlist.binarysearchtreewithrank()(positionofinsertedorquerieddata)(addtreesizeattributeforeachnode)7.bitoperationandbitset.e.g.findmissingnumberinlargedata,reversebinarynumber,8.javamulti-threading,blockingqueue,nonblockingqueue,H20,philosophydining,deadlockchecking.现在是个公司都问concurrency,一定要好好准备。9.OOP:elevatordesign,parkinglotdesigndistributed:largelogfiledesign,socialnetworkdesign,distributedcachedesign....