百度面试全攻略

原文:http://hi.baidu.com/%C2%B7%C4%CF%C6%BD/blog/item/03f3e32ad3cbbc25d42af1c2.html

在线笔试(10.21) 


  我应聘的职位是商务搜索,因此在线笔试的时间是180分钟,从早上10点到下午1点。总共四部分:10道选择题,2道简答题,1道编程题,1道设计题。 

  选择题主要考察的是Hash冲突解决方法(线形探测法和链地址法),排序算法,还有一些小程序得到执行结果。基本上使用google或baidu搜索即可以找到相关结果。 

  简答题一道是HTTP协议中几个域的名词解释,另外一道是程序改错题(返回局部数组啊,没有new空间之类的),都没什么难度。 

  编程题是找出两个有序数组中共同的元素。比较简单,使用类似归并排序算法即可。主要需要考虑有序数组的次序(从大到小还是从小到大),因此需要考虑这几种情况:数组A升序,数组B升序;数组A升序,数组B降序;数组A降序,数组B升序;数组A降序,数组B降序。还有一些异常判断以及返回结果的类型。 

  设计题还是有些难度的,baidu的设计题感觉都是来源于实际需求,想通过笔试来看看有没有更好的解决方案。需要给出数据结构、系统架构、设计思路。不过反正使用hash,map、类外排序思想以及分块计算即可。 

  一面(11.3) 

  Baidu的面试真的是一波三折。1号下午面ATC的时候接到Baidu的电话,不过当时不敢接,面完后打过去是Baidu前台,所以只能等待了。后来第二次打给我的时候我又去了WC,没带手机(找工作的时候手机还是要时刻放在身上),又没有接到。然后过了两天都没有任何消息,我开始认为Baidu可能是认为我藐视他们不接他们的电话,直接取消我面试资格了:-)。就在我对Baidu不报希望的时候,星期五早上终于接到了Baidu电话,是一面面试官,一上来就说看来你这阵子很忙啊,打了几个电话都打不通,问我什么时候有空,约个时间面试一下,当场暴汗,瀑布汗,成吉思汗。果然留下了恶劣的印象。赶紧说前一阵子实验室比较忙,会议比较多,现在忙完了,什么时间都可以。他就说那就下午三点吧。我马上就同意了。 

  驱车两点四十赶到银科大厦,到了Baidu前台,结果被告之面试官的座机打不通,让我先等待。Baidu的前台等人区很有意思,居然放了软件学报等期刊以及电脑商情报之类的电脑类杂志,随手拿了本翻着看,结果等我把整本都看完了,人还是没来。向前台mm询问之,居然被告之上午要我来面试的人出去了,不知道什么时候回来,让我继续等待。这“报复”也太快了吧,当场冷笑三声。看了看时间,居然已经快到三点半了,考虑到已经等了这么久,决定再给他们五分钟时间,如果五分钟还没人来,就义正言辞的据了Baidu。就在我准备据词的时候,突然面前出现一个人,原来是代替面试官。然后就进入了Baidu内部,房间非常大,估计有几百个工位,有点吵,他带着我找了半天,也没找到空闲的独立的房间,只好找了个偏僻的空闲的工位,开始面我。 

  一开始是用英语面的,先介绍一下自己。然后问了Java和C++的区别,c++的多态之类基本概念。然后写出atoi函数的实现。很快就写出了代码,他看了一下问我有没有问题,我仔细看了下,结果在处理负数符号的地方位置少加了1,加上后。他又问我'+'怎么处理,我随口问了句'+'是合法的吗?他说是。晕倒,用了这么多年atoi,一直以为正数就是没有符号的,原来还可以加上'+'。于是很快就补上了处理语句。然后又问如果字符数组中出现了非法字符时怎么办,我就解释到我已经作了判断,如果非法直接跳出循环语句,返回结果,而且如果结果超过了INT_MAX,返回INT_MAX。然后又问怎样返回出错信息。我说要像strtol一样增加一个参数来说明目前处理的位置指针,或者抛出一个异常。他又问还有没其他方法。我想了10秒钟都没想出还有其他的方法,他看我沉默了,笑着说如果没有就说不知道。我只能也笑了笑说不知道。 

  接下来他说为了交流方面,开始用中文交流。然后出了几个算法题,比较简单。一道是将字符串中的word进行倒序(使用临时数组进行倒序,或者使用两次倒序操作)。还有一道是给出序列中值最大的连续序列。然后又让我给出1000w条记录中求最大的前100条记录。 

  接下来问了一些搜索方面的知识,问我如何建索引,搜索的主要几个步骤(我只回答了一些基本的东西,他问细节我就直接回答不知道)。然后他问了一下爬虫爬下来的东西如何保存在文件中,如果是分布式的存储有什么需要注意的地方。反正他一步一步地增加限制条件,然后让你回答。 

  最后就是问我有什么问题了。我就让他介绍了一下部门的结构以及主要是做什么。然后就走人。 

  二面(11.9) 

  一面的时候感觉搜索部分答得不是很好。看来Baidu招人也不是很看重你对搜索是不是很熟悉。主要还是一些基本概念和基本算法。所以接到星期二接到二面的通知还是有点意外。但是那个时候我已经拿到了ATC和TrendMicro的oraloffer了,所以也就轻装上阵,什么也没准备就去了。 

  接受一面的教训,慢悠悠的驱车前往银科大厦,我是下午五点面试(很奇怪安排这个时候),四点五十到的银科大厦。到Baidu前台已经有两个人在等了,然后后面有来了一个人,居然四人都是ky的。但是他们是一面,感觉有点混乱,看来是不同部门不同的时间安排。 

  还好这次没有等半个多小时,5点过10分钟后就来人了。结果还是没空闲办公室,还是在工位上面的。 

  这次面试我的比较和蔼,年龄也稍微偏大些。而且整个面试过程都是用的中文(后来才知道这次面试官是我应聘部门的经理)。 

  一开始还是正常流程:自我介绍+项目介绍。已经说过无数次了,因此很快就交流完了。接下来他让我随便说两个排序算法,我首先给出快速排序算法,他让我说说如何计算快速排序算法的时间复杂度。这还是当初大四上算法课的时候看过了,我又没复习,于是直接回答不知道。他就问我平衡搜索二叉树的查找元素的复杂度是多少,回答(logn)。他就笑着问我既然知道计算这个复杂度,为什么就不知道快速排序的复杂度计算方式呢。我就说快排构建的树不是平衡的,所以时间复杂度计算比较麻烦,是nlogn~n^2之间。他就接了句:那你应该回答快排不稳定。接着问:有没有比较稳定的排序方法。我就说归并算法。他让我具体描述了一下细节。然后问归并的复杂度既然比快排的复杂度低,为什么大家都选择使用快排而不使用归并。答之,理论是一回事,实际又是另外一回事,很多理论上复杂度比较好的实现起来并不是很好,然后又给了字符串匹配中Horspool算法的例子。然后又问我有没有其他比较稳定的排序算法,我就回答堆排序。然后他又问了1000w条记录求最大的100条记录的问题。回答100个元素的堆排序,然后又要求给出具体细节。接下来他又问了个概率问题:三个枪手其命中率分别是80%,70%,60%。问谁被射死的概率最大?我就说从心理学的角度来说命中率最高的人被射死的概率最大。他问我具体概率是多少?我直接说不知道。他又提了句:没学过概率学吗?我说好多年不碰了,忘记了。 

  接下来他对我的研究领域有点兴趣,就问了一些我研究上的东西。已经实现的程度,是否可以应用,以及下一步的研究工作之类的。感觉他对这部分很有兴趣。 

  最后他问了一下我毕业的时间,能不能实习,能不能提前去实习之类的。我说我们那基本都是正常毕业,不能出来实习,至少要到明年7月等等。然后问让我有什么问题要问他的?对这个部门了不了解,我说上次那个面试官已经很详细的回答了。 

  于是他就说ok,面试结束了。然后送我到Baidu前台。于是走人,看了下时间才5点40多。 

  后叙 

  二面结束后,我是对后序面试不保以期望的,因为感觉面试时太直接了。谁知道第二天(11.10)下午五点多的时候居然收到了Baidu的offerletter。估计是rp大爆发了,11.10绝对是我最开心的日子,同时收到了ATC,TrendMicro以及Baidu的offer。 

  但是Baidu的offer确实是太意外了,据我周围的人面试的情况,他们都面了四轮左右。不知道什么原因我只面了二轮。呵呵,可能是部门不同,流程也不同吧。不过确实有点意外。 

  很多时候刻意去追求反而碰到无数次壁,放手时突然又会收获良多。心态平和了,待人处事思考问题的角度和方式会不一样。思维会更活跃更广阔一些,更能找到自己的节奏。 

  保持冷静、沉着、自信其实是想要一种无欲的境界,无欲则刚。

你可能感兴趣的:(数据结构,编程,算法,面试,百度,电话)