百度面试总结
很幸运的拿到百度的面试机会。今天第二面面完后,估计二面没戏了。这里大概总结下百度面试的风格。
9月20号一面
一面上来先让你介绍项目,还好之前准备了一下。在项目的基础上又添油加醋了一些东西,使项目看上去更专业一点。
我大概介绍了下项目,我提到项目用到了多线程,他就问我这个多线程访问缓冲区是怎么实现的。有哪些类和接口,这些
类和接口是干什么的。说完之后,他问我tcp协议如何建立一个连接,这个当然没问题了,三次握手。他又问那浏览器
和服务器通信的全过程是什么,我回答了tcp协议的工作流程,面试官说不是介绍tcp协议。我有点蒙,然后随便说了
点服务器在80端口监听,浏览器向服务器发送数据,服务器返回数据给浏览器。面试官又问那你的项目用到了多线程,那么
线程池是如何工作的?一开始没理解他意思,他后来稍微提示了下,我才明白他要问的是线程池的线程重用。他又问,那么,
请你类比线程池,连接池,文件池。我有点蒙,表示没听过什么是连接池,然后灵机一动是不是http的keep-alive机制。面试官
说,那你说说什么事http的keep-alive。后来回去查资料才知道连接池是数据库中的概念。然后面试官又问如何判断链表中
是否有环,这个题我已经烂熟于心了,我假装第一次碰到这个题,装逼想了会,说快慢指针。尼玛面试官一眼看穿,直接pass不再问了。
然后,面试官说,那你这个项目客户端访问服务器的访问量比较小,那如果现在有个应用,可能一天有一亿的访问量,你如何降低
这个服务器的响应延迟。我想了下,可以用hadoop,面试官说,你写过hadoop的代码吗?我说写过一点,他说,那你介绍下什么
是hadoop,他是怎么运作的。我大概说了下,他说那你不用hadoop怎么解决这个问题。我又想了个转发访问的方法,就是假设有6台
服务器,A,B1,B2,B3,B4,B5。那么A接受用户的请求,A再把请求转发给B组服务器中的某一个,由他们进行处理。面试官问,
那现在假设有1t的数据,分别存储在b1-b5上,每个存200M,现在有个请求过来后,发现数据分别在B1,B2,B3上。B1,B2,B3分别响应一个
文件分片,part1,part2,part3,你如何将这三个分片合成一个?我又蒙了,交流了下才明白他是想问排序。他又把问题简化成假设有100个
长度为2048的文件分片,你如何按顺序把这100个文件组合成一个新的文件。他给了我提示之后,我想到现在B组的服务器上对数据进行堆排序,
这样服务器A拿到3个已经组织成堆的数据,A只要不断输出堆中的元素就行了。他说,那行,你写下堆排序的代码。如何把一个数组组织成一个堆,
如何在堆中插入一个元素。妈的,还好这块我比较熟,也大概写出来了。面到这里,一面就结束了,一面大概面了一个小时。
9月22号二面
收到二面的通知我是有点惊讶的,因为自觉一面面的一般。一上来,面试官就感觉和一面的不是一个风格,一面的面试官一看就是工作没几年的,
还带着些许学生的稚气。二面的面试官不太像个搞IT的,扎个小辫子,手腕缠着佛珠,头发也有些许花白,感觉像个搞艺术的。应该是个资深员工。
一上来依旧是问项目,和一面不同,他特别关心数据库的实现,详细的问我数据库的组织结构。有哪些表,表里有哪些字段,这些字段是什么
功能。由于是添油加醋,说的磕磕绊绊的。然后他问了三个问题,第一,你们如何处理书籍丢失,就是扫了一圈,有本书没了,怎么处理的。
我,额,系统没考虑到这个问题。第二,你们如何同步学校服务器和本地服务器之间的数据,额,没同步。第三,你们有两个服务器,一个是
学校的,一个是你们自己的,假如现在有个学生借书,这个请求发送到学校的服务器,学校的服务器执行成功了,把钱扣了。那然后再访问本地的
服务器,结果失败了,那怎么处理这个问题。我想了下,瞎说了个回滚,面试官说不可以。我又瞎说了个说给事务编号。妈的,这里面的一坨屎。
然后估计面试官也受不了了,他开始问跟项目没关系的东西。他问,浏览器如何访问服务器,这个问题一面遇到过,我答的还行。然后问http协议
有哪些状态码,这个也看过,介绍了200-500,但是他问了个那100是什么意思,我他妈瞎了,不知道。然后问http协议有哪些方法啊,还好这个
前一天晚上看了,又问post和get的区别。又问操作系统的虚拟内存是什么意思,尼玛这考研内容,但是有点忘了,还好说了个大概。他问虚拟内存
存在什么地方,我有点蒙,什么意思,突然想到操作系统把内核分为内核空间和用户空间,所以答虚拟内存用的是用户空间,他又问还有可能存在什么
地方,我说可能存在硬盘里。然后又问线程之间如何通信,进程之间如何通信。我答的不好,随便瞎说了点。然后问进程和线程有什么区别,进程如何
调用系统服务,我说linux里请求个标志位,是多少忘了,你妈当时0x80已经在嘴边了没说,后来一查就是int 0x80请求系统服务。他问,你用过linux啊
那你说说你用过哪些linux的命令,我说mount,top,contrab。然后问java里有哪些容器啊,我说,hashtable,hashmap,arraylist,linkedlist。
他说,那你说说hashmap和hashtable的区别。我一开始把hashtable和hashset搞混了,然后说了个hashmap是用来替代hashtable的,最后想起来
hashtable是线程安全的。然后他又问那哈希表有哪些处理冲突的办法啊,我说了几个常见的,提到了再哈希,他问,如果一个hash(hash(key))==hash(key)
怎么办,我说那遇到这种情况就线性探测。然后我又提到了公共空间法,他问这个公共空间是怎么实现的,我说最简单的用个数组,复杂点的用棵二叉查找树。
他问二叉查找树如何删除一个节点,让我写代码。我刚写2分钟,他说没时间了,让我说下思路。我大概说了下,他又问红黑树用于什么场景,我蒙了,
都知道红黑树的树结构,但是没想过用于什么场景啊。然后面试就结束了
总体来说,百度的面试官还是很nice的,如果你不会,他会给你很多提示,而且百度一个很大的特点就是,他的面试经常是给你一个场景,然后从这个场景中
引申出很多的问题。面试的问题也很活,你说到哪,他问到哪。还是和以前的面试有些区别。二面面的不好,估计挂了。在此分享出来这个面试经历,希望
大家能从中得到一些信息。