(轉) [面经]百度商务搜索部实习生面经(已经被拒,倒在三面上了)

(单纯只是为了给自己以后面试看的)

今天发短信问了下,已悲剧。。。最近一个月来微软,腾讯,百度接连倒在技术面的最后一面上,基本上dream公司都过去了,不想说什么了,有点失落。。。直接奉上面经吧,希望都后来人有帮助,百度商务搜索部真的是个很不错的地方,这次没有缘分,希望以后能进。
  
      一个月前投的百度商务搜索部实习职位,一直都没有音信,差不多都忘了,结果周一接到电话说让过去面试,好吧,终于轮到我这个备胎了。约了周三过去,下面奉上面经。
     十一点到了百度大厦,确实气派,水榭楼台,茂林修竹,而且前台都是帅哥美女。登记后就被面试官带到五楼,一面是一位说话声音很小的小哥,很客气,寒暄之后,开始轰炸。因为投的是检索岗位,就问了一下对搜索引擎的理解,说的过程中他会提问(问的很细,直到问的我瞠目结舌为止。。。)。然后问了项目,简单的说了说,项目里我是做中文分词的,他就问对于用户的query,怎么进行纠错。我回答了两种方式,基于拼音和基于统计。他问我基于统计怎么弄,又说我看你数学建模里用到了贝叶斯网络,能不能用这个进行纠错呢,我说可以,然后写了公式,他说你这个公式其实没必要这么复杂,这么写就可以了,我连忙说是,然后他问其中一项怎么求,我想了一下说可不可以通过求两个词语的相似度来求,他又问相似度怎么求,我说以前在博客上看过,可以通过求两个词的编辑距离来求,然后说了一下怎么实现,他比较满意。然后让写了一个程序,很简单,英文句子求逆序,但每个词不能逆序,直接开写,很快写完之后他说差不多就是这样。然后让我写一个singleton类,也就是只能实例化一次的类,之前在java中看过,就说这个不是java中的概念吗?他说c++中也有,这是一种设计模式,通用的,哎。。。被鄙视了。我说我试试吧,然后凭借对java的记忆写了一下,他说写的差不多,但其中两个函数可以合并,我说确实是这样。我说这种类是不是一般用于数据库连接池,他说是,然后说既然说到连接池,那如果有两个线程想同时实例化这个类,该怎么办(我真是多嘴啊),我说加锁,然后他说加锁太慢,然后说能不能通过设定一个标志来判断是不是已经被实例化了呢?我这时想到了智能指针,然后说能不能模仿智能指针里判断指针是否已经动态分配内存的方式,也就是设定一个计数器,来记录已经被引用了多少次,如果引用次数为0则实例化,他说这种方法可以,那这个计数器改变的时候需要加锁吗?我说在生产者消费者模型中的计数器是需要加锁的,那么这个也得加吧,他说其实不用,编译器已经把这个优化了,计数器操作可以被优化为原子操作,之后他又说其实链表插入操作也被优化成原子操作了,我只能感叹学校里学的知识多么落伍,他说没关系,可以工作之后再学。最后他问了问能实习的时间,就让我问问题了,我问商务搜索和网页搜索有啥区别,他解释的很详细,然后说下午来二面,二面面试官会通知你,送我下楼,握手再见。。。
     下午一点多接到电话,是二面面试官,说现在过来吧。到了之后又是登记,然后来到面试地点,一看是俩面试官,难道要多对一?我说了自己的疑问,其中一个说自己是来旁听的,不用紧张。自我介绍之后开始轰炸,先让设计一个栈,使得push,pop,min操作的时间复杂度都在O(1),这题见过,直接说结果,pass。然后问一个海量词库,给你一个词,怎么找到这个词的兄弟词,兄弟词就是字母组成相同,顺序不同。刚开始说用hash,他说这方法可以,但对于一个海量词库,每次查都要遍历,效率低,问还有没有更好的。我突然想到之前好像看过这题,就说可以给每个字母设定一个素数,那么一个单词的key就是组成字母对应素数的乘积,然后用这个key做hash,面试官还比较满意。这时旁听的小哥说话了,能不能先对词库做预处理?我说可以用key值做键值生成B+树,他又问那对于键值相同的词怎么处理,我说可以把他们连成链表,他对于这个答案还比较满意。之后问了判断两个链表是否有交点,我就把网上说的方法说了一遍,他说能不能说一种通用的方法呢?即快又能应对各种情况,我想了一下,说遍历链表的时候把链表节点的地址做hash,然后拿另一个链表节点中的地址在这个hash表中找是否有相同的节点,他说这个方法比较通用(其实这个方法是在一个讲座中听到的,而且是百度运维部的一个工程师讲的)。然后就让写个程序,刚开始说的题目跟一面的相同,我怀疑是不是在考验我是不是诚实,所以就老实说这个题重了,他说那就换一题,判断两棵树是否相等,包括结构,每个节点的key值。然后就开始写,写到一半,他好像有急事,就说你先说说思路吧,我说用递归的思想遍历,然后逐一比较,他表示肯定,然后就说过会我们开会,二面就到这吧,过会通知你是否通过。
     然后就在楼外焦急等待,大概三点多,收到通知说二面通过,过会三面面试官会联系你,当时那个高兴啊,以为三面就是走过场呢。没想到大意了,噩梦就此开始。三面面试官感觉很犀利,也没让自我介绍,看了一眼简历,说你以前在腾讯实习过?做过什么东西?我说做的手机上的app,都是些表面的东西,然后他砰地一声,把电脑合上,说做个题吧,当时吓了一跳。他问我一个整型数在文件中有哪两种存储方式,我想了一下说是二进制和文本,他说对于一个很大的文件,里面存了好多整数,在上述两种方式下,怎么随机的在其中取一个数,当然文件不能直接放入内存。我先说了二进制的方式,直接用求文件大小N,然后seek(rand%N),找到那个数。然后他说那文本方式呢,我说也用这个方法行吗?他说不行,因为文本方式中的数是不定长的。然后就陷入思考,他说可以先提出比较原始的方法,再优化,我说先遍历求出文本有多少行,再根据这个行数取随机数,第二次遍历找到这个数,他说那这样要遍历多少遍呢?我说一到两遍,平均1.5遍。他说能不能遍历一遍就求出呢?我想了下,说可以对于每个数求一个随机数,哪个随机数大就取哪个,他想了一下,问这样每个数是等概率取到的吗?我说应该是吧,不太确定,他说其实只要种子一样,每个数对应的随机数的期望是一样的,那么后面的数被留下的概率就大,我连忙点头,他说还有方法吗?我这时想到以前好像见过类似的题,就跟他说以前见过类似的题,只记得结果,好像是取到的随机数还得除以N,N是整型数在文件中所在的行数。但是不知道怎么证明,他说这样啊,结果是对的,那写个程序吧(当时想他是不是不想跟我聊了,悲催)。程序题更加悲剧,让写strncmp,之前没用过,虽然原理简单,但在短时间内想写明白还是不太容易,而且他在旁边盯着,弄的我好紧张,最后写的一塌糊涂,他看了一眼代码就说你这个代码风格和逻辑都有问题,拿回去自己再看看吧(当时就泪奔了),然后他说问完了(当时就想,怎么就两个题啊,感觉他就是不想继续聊了),我随便问了一个问题,他回答的也超级简单,好像想早点结束,呜呜~~~~(>_<)~~~~ 。结束之后我问多长时间给通知,他说一周吧,哎。。。又得等那么久,五一又得纠结了,悲催。。。。 
总结: 
1.    即使是实习生面试,难度和强度也丝毫不会下降,有时候感觉这样是不是有点过分,不过想想也没有更好的方式去考察一个人的能力了。 
2.    百度面试还是很在意算法的,而且问的很细,所以要把一个算法理解透才行,不能只知道答案。面试官最希望看到的是你在他的引导下一点点的把问题解决,而不是你本来就知道答案,这样他就没法考察你解决问题的能力了。
3.    同时面试的时候不能大意,每一面都很重要,骄兵必败,老祖宗的道理从来不会错,我就是二面通过后太大意了,得意之后就没有之前那么集中注意力了,弄的后面程序题写的很没状态。
4.    最后预祝大家都能拿到满意的实习offer,为毕业找工作添加砝码

原文地址:https://www.cnblogs.com/yejinru/p/2860336.html