时间:2017年10月16日11:30面试。前端
地点:重庆万达艾美酒店。面试
信息:女,本科应届生,面试后台开发岗位。算法
在深圳的面试已经所有结束了,偶然间听朋友说重庆、长沙等场地的面试还在进行中,只要修改面试地点,仍然有机会拿到面试机会。因此我抱着试一试的心态,在腾讯校招官网上修改面试地点为重庆。10月13日中午收到了腾讯的面试通知,面试时间是10月16日11:30,面试地点在重庆万达艾美酒店。数组
收到短信通知的那一刻就已经有点紧张了,一开始我也很犹豫到底要不要跑回重庆去面试,电话里我爸说我既然那么喜欢腾讯,就应该抓住每一次机会去尝试,不看结果,至少咱们经历过嘛。因此14日一大早就买上了15早上飞往重庆的机票。我也不断提醒本身,紧张只会影响发挥,就当本身是回重庆改善饮食、度度假的。抱着这种心态,一直到走进万达艾美酒店以前我都再没有任何的紧张感。当酒店正门在视野中出现的那一刻仍是忍不住紧张,因此我努力使本身保持微笑,一有机会就跟身边的人闲聊,渐渐熟悉周围环境以后也就忘记紧张这个名词了。服务器
电梯里遇到两个小哥哥,两个都是面试产品经理的,其中一个也是跟我同样来自深圳,酒店服务员让咱们来到4楼,一出电梯就看到一组二维放置的椅子,里面稀稀落落的坐了很多来面试的,他们全是霸面的,凡事有正式通知面试的同窗直接被送到里面房间扫码签到等待。跟我带路的是腾讯的小哥哥,面带微笑询问我是面试什么岗位,我说后台,他脸上的表情很丰富,很是惊讶我做为一个女生来面后台!我说我是本科生,他的表情更加夸张了......惊讶转佩服,他估计是佩服个人勇气,说看好我并未我加油。多线程
签到后,里面房间的位置也就坐着一个同窗在等待面试,我径直走到他旁边的位置坐下,主动跟他搭话,他是面试前端的研究生,一边跟我说着话一边不停地敲着键盘,看他很专心地在研究他的代码,我也就没再打扰了。静坐了一分钟左右,又进来一个男生,坐在咱们后面的位置,主动向咱们两个搭话,他是来复试后台的重庆大学研究生,旁边男生一听是后台,立马让我跟他好好交流,我也很识趣地移到后面男生的旁边坐下。这个男生很nice,得知我是本科生,看了看个人简历,而后向我分享了他的经历——他在本科毕业以后也向我同样来面试了腾讯,可是被拒,拖了一年后开始准备考研,考了两次以后成功考上了重庆大学的研究生,直到如今他本身手上已经有其余公司的offer,而后再来面试腾讯。言语之间已经感觉到他十足的信心了。可能以为这个时候的我很像当年的他,因此给了我不少建议。还没来得及互相留联系方式,他就被叫去面试了。他走后立马又来了一个复试后台的重庆邮电研究生,坐在我旁边,得知我是一面且是本科生,再也不感兴趣,因而掏出手机开始看资料,一边看一边告诉我让我看看XXX,一面可能会被问到。不怕丢脸,讲真的,他说的那两个名词我都没听过......这也许就是本科生和三年研究生的差距吧!并发
终于轮到我面试了,地点是7楼,走出等候室,仍然是刚刚的小哥哥给我带路,帮我刷卡按电梯,并一直夸赞和鼓励我,我苦笑一句说我本身也以为很意外,并且我看过来面试的都是研究生,他很温柔地告诉我不要紧,面试官对研究生的要求和本科生的要求是不同的哦~最后送了我一个微笑和好运祝福后让我关上了电梯门。ide
电梯到达7楼,作了一次深呼吸后,我面带微笑走进了726房间,面试房间的布局和我想象中的同样,面试官的状态也和我想象中的同样 —— 一副刚起床的状态!面试官坐在书桌的电脑前等个人到来,我在走向他的途中用余光扫到旁边床上被子是凌乱的,床边他的靴子东倒西歪并向外吐着袜子,床头柜上还有打开未吃完的薯片。面试官看起来没有很好相处,我会这么以为,大概是由于他没有回应个人微笑吧。从进门开始我就介绍了我本身的名字,并一直面带微笑。函数
面对着他坐下后,首先被要求作个简单的自我介绍,名字+大学+专业,而后说明我是深圳过来重庆面试的,他很惊讶我来自深圳,同时也很好奇,我本来觉得他是知道我9月份在深圳已经面试过的,并且对于每一个已经面试过的同窗面试官都会写一份评语,我也觉得他已经看过评语,看他的反应大概是什么都不知道,因此我作了一个详细的说明以后便接着个人自我介绍模版说下去。待我说完,他估计是看到了以前面试官对个人评语之类的,没有再问我简历上的内容,直奔主题——作题!一共作了三道题。布局
第一道题是算法设计题:有N个数组,每一个数组有M个元素且呈升序,求这N个数组的并集。例如:第一个数组有{1,2,3},第二个数组有{2,3,5},则合并后为{1,2,3,5}。
(1)我首先想到的是牺牲空间节约时间的办法,申请一个超大的数组A,初始化为0,遍历这N和数组,将元素做为A数组的下标访问A数组并置1;N个数组访问结束以后,再遍历一次A数组,其中值为1的下标的集合就是合并后的结果。听我讲完,他首先问我时间复杂度和空间复杂度,时间复杂度是O(N*M),空间复杂度是元素的取值范围。面试官提示我本道题是在64位系统下实现,而我须要的空间大小为元素取值的范围,也就是说最多能达到2^64远大于1Gb,因此这个方法是不可行的。
(2)我知道我一直没有利用到“有序”这个关键词,因此我抓紧这关键词,首先想到的是二分查找:以两个数组A、B合并为例,以A数组为基准,遍历B数组的元素,利用二分查找,将B的元素在A中找到最适合的位置,
说完思路,他接着问我,那N个数组怎么合并呢,我回答的是递归拆分,直到只剩两个数组为止,而后再逐次往上合并。回答完递归后,我本身都以为太过复杂了。他继续问了下时间和空间复杂度,两个数组合并的时间复杂度主要取决于二分查找的复杂度O(logM),总共要找M个关键字,因此两个数组合并的复杂度是O(MlogM),再加上N的数组的递归拆分大概就是O(N*MlogM)的复杂度了,空间复杂度为常数。能由“有序”关键词想到了二分查找,面试官也勉勉强强接受了。
(3)我看他的表情不太满意,因而我主动表现出对巧妙方法的兴趣与渴望,因而面试官就给了我一个提示:“就以你两个数组为例,你每次无非就是在确认一个数。”灵光一闪!我知道了!
那么N个呢?递归的话容易实现,但不必定是最好的,若是每一个数组一个指针会不会空间太大呢?只有N个数组,只须要N个指针,N个指针同时进行比较,每次找最小的一个数记录(问题简化了,至关于在N个数中寻找最小的一个数)。显然N的指针更佳使人满意。那这N的指针如何进行比较?我先说的是快排的拆分函数(以一个数为基准,比该数小的在左边、大的在右边),而这个基准数是随机的,因此调用一次拆分函数,返回函数中基准值下标,若是下标大于1,再对下标的左边部分继续调用函数;若是下标小于等于1,直接返回下标为0的元素。这样的作法减小了递归次数,没必要使得整个序列有序。可是这个作法仍是不能让面试官满意。N个数中,只是找一个最小的数,我还能想到的是堆,可是我对于堆不熟悉,只知道当记录数不少的时候用堆最合适。我也是这样同跟面试官说的,最后再次问了时间和空间的复杂度,我理解的堆排序时间复杂度是O(nlogn),可是这个复杂度是将整个序列变得有序的复杂度,而咱们只须要找一个最小的,因此个人回答是,若堆排序的时间复杂度是X,那么这种解法的时间复杂度是O(N*M*X),空间复杂度为常数。
第二道题是写代码,让我写出回文数的代码实现,给了我一个函数的定义,让我实现该函数。固然我会故意问一位数的数字算不算回文数!这道题没什么难度,因此我镇定自若地写,也把全部边界状况都考虑到位。写了一个最简单的代码:
1 //-1:异常 2 //0:不是回文数 3 //1:是回文数 4 #define N 100 5 int Palindromic(int value) 6 { 7 int x = value, k = 0 ,start, end; 8 int a[N] = {0}; 9 10 //拆分数字,将每一位存放进一个数组 11 if(x==0) 12 return 1; 13 while(x!=0) 14 { 15 a[k++] = x%10; 16 x = x/10; 17 } 18 19 //从两头开始比较 20 start = 0, end = k-1; 21 if(start > end) 22 return -1;//不可能发生 23 else if(start == end) 24 return 1; 25 else 26 { 27 while(start<end && a[start]==a[end]) 28 { 29 start++; 30 end--; 31 } 32 if(start<end) 33 return 0; 34 return 1; 35 } 36 }
后来仔细想一想之前的代码,还有更简单不易错的代码:
1 //0:不是回文数 2 //1:是回文数 3 int Palindromic2(int value) 4 { 5 int x = value; 6 int remainder = 0; 7 int reverse_value = 0;//反转数字初始化为0,使得value=0时函数也成立 8 while(x!=0) 9 { 10 remainder = x%10; 11 reverse_value = reverse_value*10 + remainder; 12 x = x/10; 13 } 14 15 if(value == reverse_value) 16 return 1; 17 18 return 0; 19 }
第三道题他说是设计题,让我设计一种方法来测试服务器的压力,听完他的题目说明,我是一脸萌比的,大概是问的“假设:服务器tps=100000,怎么测试服务器压力”,很尴尬的向他求助,能不能给点提示,他又说“假设一个线程tps=1000”,结合他的提示,我只能把与相关的知识所有说出来,如线程的通讯方式:(1)管道(2)系统IPC(信号量、____、消息队列)(3)套接字Socket,其中漏了一个,由于这个问题毫无头绪,我已经有点着急了,接着继续说,要想达到100000的tps,确定须要多个线程,我想用信号量来实现,例如我100个进程就能达到想要的tps的话,我给这些进程100个锁来实现。他忍不了,说用共享内存来实现多个进程的通讯更快,我恍然大悟,哦!!我遗漏了共享内存......我急忙赞同他的说法,他又接着问我这多的线程要怎么管理呢?这...我只能认输不知道。他告诉我,须要用一个线程来管理其余多线程的并发操做。
后来本身百度了下这个问题,原来是WeTest的测试大师http://wetest.qq.com/gaps/
三个问题问完以后,对于面试结果,我内心仍是有点B数的,面试官并无走流程让我问他问题,说今天的面试就到此吧。我起身拿起包打算离开,但仍是很像问他问题,因此我先问他我可否向他提一个问题,他赞成以后,我问他咱们这样的本科应届生有什么建议和意见吗?他仍是很耐心的跟我讲了一些对应届本科生的建议,最后说我阅历太少,经验不够,基础功不扎实。我回应了几句,并向他表示了真心的感谢以后离开了房间。
面试官的评价很到位,赤裸裸的现实,仍是回校补补养分吧!不过这份经历仍是值的,一个毫无经验的应届本科生同几个研究生来竞争一样的职位,虽然结果很明显,但仍是很是感谢面试官给我这个面试机会,并且整个面试过程当中还那么耐心的引导我!
个人博客即将同步至腾讯云+社区,邀请你们一同入驻。