一面是第一天的早上九点,记得那天很早就起床了,和同学一起去的酒店,本以为我们已经算来的早的了,到了酒店才发现整个大会议厅都是人。然后就是排队签到,没等几分钟就叫到我去一面了...
一面面试官貌似一直在等我,可能我是他第一个面试的。我一进去就叫我把简历给他,然后让我自我介绍了下,不到一分钟就介绍完了(主要自己觉得没什么好介绍的),这时面试官还在看我的简历。等了一会,面试官开始问我简历中哪个项目是我最熟悉,最能体现我能力的项目?然后我就把实验室做的一个项目介绍了下,包括项目背景,架构,自己负责的模块等等,在介绍过程中面试官根据我说的提了一些关于系统并发量,效率的问题。问完前面的项目之后接着问了关于实习做的项目情况,我就啪啦啪啦的说了实习部门所做项目的一个架构图,然后他就开始针对这个架构提问题,记得问了:怎样在增加了节点的情况下使得所有机器的负载都均衡的降低?之所以会问这个问题是因为实习那个项目架构并没有考虑这个问题,然后我就说用redis集群那种多个slot的机制或者用一致性hash的机制来解决。问完项目之后还问了两道大数据的题目:
- 在10亿个整数里面找出最小的100个数?
- 给定几百万个IP段(如10.0.0.1 -- 10.0.0.100),不重复,不交叉,现给你一个IP,求IP所在的IP 段。(不计IP段数据的预处理时间)
第一个说了两种方法,一个是用大根堆,一个是用了bitmap。第二个直接用二分,将IP转换为整数。
二面一面结束后大概晚上10点左右接到二面通知,明天下午三点到酒店面试,到酒店发现人依旧爆满,不知道今年腾讯招多少个啊!!!签了到后很快就轮到我了,一看到二面面试官,就感觉面试官很随和,很有礼貌的叫我坐里面,不用给他简历,他已经有了什么的。等我坐好后,他并不是问我问题,先介绍了下他们部门是干啥的,然后问我对他们部门感兴趣不,他还说如果不感兴趣那我们就到这里。这种时候我也只能说感兴趣了~~,要不然就game over了。看我点了点头后他就说那我们开始面试吧,然后在纸上写了个函数叫我实现。
int atoi(char *str)看到这函数,我就想这个应该主要考查各种异常处理情况吧,然后就在脑子里想了一下各种异常情况,当我准备动笔写的时候,面试官却说只考虑是正整数的情况,不考虑溢出什么的,听了这话我就纳闷了,心想这还有什么好写的啊,都不考虑异常处理,难道有什么陷阱?结果面试官又来一句我就看看你写程序的一个思路,习惯!好吧,这我才放心开始写,差不多写了五分钟,他看了之后点了点头说那我们继续。后面他大概问了三道题目:
- 一个文件有100w行,每行是一个长度为20的字符串(由a-z中的字符组成),内存大小为8Mb,问重复次数最多的字符串是哪个?
- 一个正方形,去掉左上角的1/4后余下的图形怎样均分成4个大小,形状相同的图形?
- 后台服务器每分钟会给客户端发送总共约10w个心跳检查包,每个心跳包的往返时间在0-100ms之间,求每分钟内这些心跳包的八十分位数(将往返时间从小到大排序,排在第80%的数,这个中位数的概念类似)?
第一个题目我先将文件通过hash分到10个小文件中,然后用hash_map来统计各个字符串出现的重复次数。面试官说可以,然后说我现在只要找出重复次数最多的那个字符串的重复次数,不需要找出具体是哪个字符串。问我有没有更好的方法。然后我想了想,如果不要保存字符串的话,直接将每个字符串都hash到整数空间,然后进行统计次数,内存差不多是8Mb,面试官听了说可能会出现冲突的情况的一些细节。
第二道题目想了一会没想出来,后面面试官提示说这次是技术面试,不是要你瞎蒙,要分析,分析可能更容易找到答案。我再想了想还是没有想法,然后面试官就说算了。回到学校后想了想,和同学讨论了下,其实很简单,当时面试时没有把思路放开啊!
第三道题目我特意跟面试官确认了心跳包的往返时间是在0-100ms之间,有了这个信息这个题目就好解决了,只要开大小为100的数组a来做计数器,对0-100ms之间的每个时间都统计对应的心跳包的数量。求八十分位数只需要从头遍历数组a,找到对应的第80%个位置的往返时间就ok了。
上面三个问题问完之后,面试官直接就说我这边你已经通过了,说我是他今天最后一个面的了,有时间,就开始和我啪啦啪啦聊他们部门,然后要我好好考虑是去他们部门还是去我实习的公司。
三面果然和二面面试官说的一样,我很快就收到了三面通知,去面三面时候明显感觉现场的人数锐减,会议厅也换成了一个小的。三面面的很轻松,就是聊人生聊理想啥的~~~
总结
腾讯这次面试总的来说还是比较的轻松,没遇到什么大的麻烦,也许是自己运气好,碰到的面试官人都比较的好,也许是因为我实习过吧。就是二面那道题目没有想出来有点可惜,本应该能做出来的。