7月22日中午终于等来了百度的面试通知,约在25日下午3点在百度科技园2号楼。
25日下午1点10分从所里出发,到知春路坐地铁,西二旗下地铁,本来想走过去,却发现西二旗到百度科技园还有很长一段距离,于是叫了个出租过去了。到地方是2点15分,等到了2点45分前台登记了下,说面试的小哥会下来接我。等了没多久,小哥下来跟着上了5楼。面试开始。
一面
一面的小哥还是比较nice的,一起上楼梯时还问我怎么来的等等,到面试的会议室还给我接了杯水,确实很nice。然后面试开始,我带了简历给了小哥一份,然后小哥让我介绍一下自己参与最多的一个项目,然后我跟他讲了讲自己目前做的一个项目。之后小哥针对项目中的一些点问了问我,我都一一回答。我觉得这段因人而异,主要问你项目中用到了一些知识点,以及你解决项目中问题的思路,所以简历的上的写的项目上的一些点一定是自己熟悉的,而且也要尽可能的让面试官理解。之后小哥就给我出了2道算法题,其实都不难。
*** 1, 给定一由空格和一些单词组成的字符串,让实现字符串的翻转,但单词内的字符顺序不变。***
这道题其实很简单,相信大家一听也会立马有思路,所以我也一样,我就说直接用空格分割然后把分割出的单词倒序累加起来。
这样比较耗资源,字符串之间的+还是比较耗资源的。有没有其他办法?
于是我就又想了想,发现其实这是一个字符串的翻转的变型,于是对小哥说我们可以从头到尾遍历这个字符串,然后遇到一个单词进行翻转,当所有的单词翻转完成后再对这整个字符串进行反转。
嗯,思路是对的,那你用代码实现一下吧
于是我就按照那个思路写了写代码,写的过程忽然意识到一个问题,就是单词之间的空格数不知道是多个(1个的话用if判断,多个的话就得用while循环了),于是就赶紧问了问小哥。
不固定,可以是一个也可以是多个
好吧,于是我就赶紧又改了改(之前以为只有1个),写完后检查了下就拿给小哥看了看。
你这个如果第一个字符是空格的话就不对了
额,我赶紧说我默认这个字符串第一个字符不会是空格(😓)。
那你把这个考虑进行去吧
于是我又改了改代码。随后小哥又看出来我的代码最后一个字符如果不是空格时会漏处理,于是我又加了个判断语句(😓)。之后小哥看了看说没有问题了。
*** 2, 不要用* /符号实现a/b。***
这个题目第一直觉就是用减法,所以我就说用减法,然后小哥指出来说如果a很大,而b很小,这样其实是比较慢的,让我再想想。我想了会说可以用递归,每次将a二分,然后累加两半的商。小哥听了说这个可能会有问题,如果7/2,按照二分就是(3/2)+(3/2)!= 3并不能保证解的正确性。然后他说让从如何减少减法运算来考虑。我心想既然a变小不行那就b变大呗,于是我又想了想就跟小哥说可以把b先按照指数级递增直到a - 2^k * b < b(代码中使用b的左移代替*),然后小哥说还有没有其他情况,于是又想了想说如果a - 2^(k+1) < 0那么说明a/b的商在2k到2(k+1) 之间,那就再遍历吧。说完我就笑了笑说k很大时也不行,小哥说对的,然后跟我提示了下说如果再用(a-2k)去除b得到的商然后加上2k是不是就是a/b的商了,我笑了笑说是的。然后就让我继续写代码,刚写没多久,小哥说时间差不多了,就没让我写了,就问我有没有其他问题,我就问了问部门做的东西,组织架构啥的,小哥也跟我谈了谈。最后跟我说去联系下二面的面试官,让我等一下。听到还有二面我心里还是挺开心的,说明还有戏,其实总结一下,这两题缺失都不算很难,主要的是要把边界以及逻辑搞清楚,看来还得多练啊,不过小哥确实比较nice,中间还给提示一些内容。
之后小哥回来说二面的面试官还在面,需要等1小时。。。
于是我就和小哥又继续等了一小时,中间又和小哥扯了扯别的。。
二面
等了1个小时左右二面的面试官终于到了,然后递给他简历,感觉第二个面试官没有第一个面试官爱说,由于第二个面试官问的较多而且有点碎,下面我就直接列出来了。
- 首先还是项目,让我介绍项目,以及项目中的思路。
- 你对机器学习哪些算法比较熟悉?
- 你对EM算法了解么?(这个我还不太了解,只是听过,于是我就直接说不了解😓)
- 讲一下k-means的流程?
- 有哪些因素会影响k-means的聚类效果?
- 讲一下map-reduce流程。
- 任务执行过程中的map阶段,如果一个节点挂掉会怎么办?
- shuffle的作用?
- Hadoop里你觉得最复杂或者最难的是哪一点?
之后是4道算法题,都是常见的,第一个就是问我写过排序没,我说写过,他说那你写一下快排吧。然后又说你对c熟悉么,我说一般吧。。他说你用c写吧😓。其实我简历上写的是熟悉java,python。。刷题也都是用java写。。所以当时只能硬着头皮写了。。 - 写一下快排。(写完后他也不要我讲,就说我先看着,你先写一个。。。)
- 寻找链表中倒数第k个节点。
- 找出二叉树中两个节点的最低公共祖先。
其实这3题只要刷过题的人都见过的,所以应该不算难,第三题我是用寻找两个链表中共同的节点的思路实现的,他说这样会耗费空间,如果用递归会好一点。 - 一个数组,又n个元素,每个元素是1-n之间的数,让你用o(n)的时间复杂度和o(1)的空间复杂度打印出数组中每个元素出现的次数。
这个题我已开始听错了,于是就说直接用一个数组当hash表,他说空间复杂度是o(1)...之后我又想了一会确实没想出来。。所以这个题就没搞出来。他说这个题其实是个智力题,之前的几个面试的人也都没做出来,让我不要又压力。。于是又继续问其他问题了。。后面的问题就偏操作系统了,他先问我对linux熟悉么?我说还行。下面括号里面是我当时答得。 - 如何根据一个服务进程的端口号找出这个进程。(service -all | grep 8080)
- 一个文件每条记录有10列,第9列是整型数据,找出该列的最大值。(cat file.txt | awk -F ' ' {$9} | sort | tail -1)
- 进程之间的通信方式
- TCP协议的三次握手(这个记不清了,就大致跟他描述了下)
差不多问了这么多吧,之后面试官说时间已经比较晚了(当时已经差不多6点40了),就又问我有没有其他问题,我看也这么晚了也不能耽误人家吃饭。。就随便又问了下组织架构(当时也确实不知道问啥了。。和上一个小哥聊了那么多。。。),然后他说完,我就说我也没什么问题 了,这么晚了,就不占用您太多时间了。之后面试官就说这么晚了也没办法找人3面了,你先回去吧,那个人如果有时间再通知你。
所以到底会不会有3面。。
期待3面吧。
暂时总结下吧,首先项目上面我觉得还是得熟悉你的项目,要对你简历上写的内容认识特别清晰,这样才不会被面试官问倒。其次,其实面试中的算法题都不算太难,甚至都是原题,但要现场写出完整的代码还是不太容易,所以平常要多练。最后,操作系统,linux,网络这些基础的东西不能丢,也要多复习多背背。