Google,腾讯,网易,微软,爱奇艺,字节跳动面经(长文)
从最早2月开始投递简历,到现在5月底终于收到了offer,春招总算是画上了句号。在这里写一写自己的一些经验和感悟吧。
背景:985,211(计算机学科相对弱势) 计算机科班大三,专业排名约20%,ACM区域赛银,无项目经历。
时间线:
2.13: Google Summer Internship 填表
2.22: 阿里(Java开发)网申
3.5: 旷视内推
3.6: Google一面(电话面试)
3.7: 网易网申(音乐事业部-杭州)
3.10: 腾讯网申(安卓客户端开发-上海)
3.14: 旷视自投(直接给leader发了邮箱)
3.16: 旷视面试(一面跪)
3.20: 腾讯提前批面试(一面跪)
3.21: 微软网申(大陆预科生)
3.25: 爱奇艺、美团点评网申(测试开发)
4.2: 微软笔试
4.5: 腾讯正式批笔试
4.7: Webank网申
4.15: 网易面试(一面跪)
4.16: Webank笔试
4.19: 爱奇艺笔试
4.20: 微软面试(完成3面)、美团点评笔试
5.2: 字节跳动网申(后端)
5.5: 阿里自动投递(改职位为测试)
5.11: 阿里笔试
5.12: 字节跳动笔试
5.19: 字节跳动面试(完成3面)
5.25: 字节跳动口头offer
5.28: 字节跳动正式offer
(惨痛的春招经历)
PS: 此外还在实习僧上投过好多其他的公司,比如八爪鱼、盛大游戏、触宝等,但是感觉实习僧上投递简历的成功率很低,实习僧上面投的统统挂在了简历上。
总体来说,笔试一直都比较顺利,Google的笔试是Kickstart有一定难度,校招轮次是每年的7~8月的两轮;腾讯、爱奇艺、Webank、美团点评、网易、微软的笔试相对都比较简单。阿里的笔试难在选择题,字节跳动的笔试要全AC还是很有难度的,当时AC了两个,还有一个做了小数据部分,最后还是通过笔试了。
Emmmmm感觉上的话,ACM的经历还是在笔试方面给了不少的帮助,如果没打过ACM,笔试上可能没有这么顺利。
以下是面经:
1. Google Summer Internship(远程电话面)
自我介绍;
聊了聊ACM竞赛,自己比较擅长的方面;
有没有听过背包问题(引出DP);
说一说DP怎么实现的;
01背包的思路;
01背包 且 保证只有价值为1和2的物品情况下,怎么得到解;
一开始想了个错误的贪心,后来发现有问题,给了一个O(n2)复杂度的算法;
后来用优化成了O(nlogn);
面试官最后说,除排序外可以做到O(n),然后说代码不够精简。
一面就结束了,几天后收到了Thank you letter。
本来对Google报的期望还蛮大来着。
2. 旷视(现场面,长期实习生)
旷视寒假结束后就找Jove师姐做了内推,但是好像要求比较高,一直没有被发起面试,后来Jove师姐发给我一个俞刚team长期招实习生的帖子,就自己给帖子上留的email发了邮件,隔天接到了电话和面试邀请。
同样自我介绍开头;
问了一些ACM比赛经历;
算法题:有一支股票,知道每天的价格,本金一定,只准买卖一次,问如何做到收益最大。
有些印象,好像是曾经的一个训练题,当时第一反应是用dp做,想了半天没写出转移方程来,又想到可以预处理一个后缀最大值。面试官提示说是一个O(n)的算法,后缀最大值有用。最后把O(n)算法写在白纸上写出来了。
算法题:给定几个互不相同的数字组成的一个字符串,输出同样由这几个数字组成的,字典序恰好比它大1的字符串。
这个题相当于是一个next_permutation(),答出这个之后被要求不能调用这个函数,于是手写了一个,还是写出来了。
C++的多态怎么理解;
虚函数有什么用;
虚函数在内存上占多少字节;
Python的Global变量怎么实现的;
算法题:(s,n)表示字符串s反复出现n次;s->t表示s去掉若干字符之后能成为t;
给定S1与S2,求最大的m使得S1->(S2,m)
这个题有点被难住了,因为给定的S1和S2都可能是很大的,n2被认为是不可接受的复杂度,所以最后讨论了很久还是只停留在了一个思路的阶段,勉强说明了符合复杂度要求的算法大致思路。
总的来说旷视的面试还算是挺适合没有项目经历的ACMer的,但是当时多态和虚函数已经忘得差不多了,答得都不是很好(回学校之后复习了一遍)。
整个面试持续了将近两个小时,结束以后一直没有音信,最后收到了Thank you letter。
3. 腾讯提前批(现场面,安卓客户端开发)
自我介绍;
问了问学了哪些课程(答了一些之前学过的专业课,算法、数据结构、C++之类);
问了问之前带的一个大创项目(和Android开发有关的),apk还在不在;
(当初项目结项结的比较草率,临时下载了apk在当时我的8.0安卓上闪退了);
Android的生命周期;
Android的handle();(emmm没学过,不会)
算法题:给定一个有序的列,随机某个位置切一半以后把前段接到后面,用二分搜索序列中是否存在给定的值。
因为不知道切断的点在哪里,题目的二分搜索又误导我,反复写不出来,怎么写都是O(n)的复杂度。。。
最后面试官给了个每次中间切一刀的递归做法。。。emmmm好吧,第一次知道二分搜索可以递归。。。
然后一面就这么跪了,面试官最后说让回去再多学学知识和算法的拓展。。。
4. 网易面试(杭州-音乐事业部,测试开发)
收到通知发现没法在北京远程面,网易笑招说可以报销上限600的路费(报销审核通过,但还没到账),和爸妈商量了以后就去了杭州,顺便回了个家。这里我要吐槽一下网易的面试。。。这是我自己付出代价最大的一场面试:自己搭了路费、住宿,还翘了课,却是体验最差的一场面试。。。
依旧是自我介绍开头;
与之前不同的是:之前的面试,开始之前面试官都已经至少看过一遍我的简历了,这回面试官好像从来没见过我的简历,让我一边自我介绍一边看,而且走神了好几次,要我重新讲。
问了几个工程上的东西;
(我明确表示我没有工程经历,暂时都没学过,但是还是接着问了好几个)
MySQL和PgSQL有什么区别、各自的优缺点;
(我说我只学了pgsql,列举了一些pgsql的优点)
Python的切片会吗;(我当时不知道是split。。。就说了不会)
手写一下快排;
Linux用什么命令查看进程;
算法题:给定乱序的1~100,从中挖掉两个数,给你一个存储单元和一个能加减存除的运算器,找出这两个数。
(题意面试官给的也不明确,我确认了好几次之后才成了现在这个样子)
这个知乎上看到过一次,拿和与平方和就能列出方程求解。
拿出手机让我给网易云音乐的搜索框设计一些测试用例。
然后现场出结果,一面就没过。
接下来是吐槽:面试过程中面试官走神了好几次,中途手机收发了两次消息,接了一个电话,倒不是啥大事,但是给人感觉就不是很专业;问切片的时候我说不知道,直接接茬“这都不知道,也能说会Python?”;我明确说明没有项目经验了之后,还一直在问一些工程方面的东西emmmm也是无语,只能跟一串不会;大老远从北京赶过来,够有信仰了吧。。。结果你让我一面都没过。。。
网易这一面暴露了自己项目经验短缺的缺点,但是总的来说跑一趟一面滚粗,自己菜是原罪,但是这个面试官我还是想实名怼一下的。
5. 微软(C+E 大陆预科生,完成3面)
微软的3面都在skype上完成。
一面11:00开始,面试官迟到了大概20分钟。
自我介绍,聊了一些ACM竞赛经历;
一些课程设计是做什么的、怎么实现的;
C++的多态怎么理解;
算法题:给定一些正整数(1,3,4,5,7),输入一个n,输出最少用多少个给定的数能加出n来。
一开始给了一个贪心,后来发现不对;
后来找到了一个特判,修正之后对(1,3,4,5,7)适用了;
要求对任意输入适用,于是写了一个dp,最后dp写出来了。
一面结束;
二面13:00开始。
自我介绍+课程设计;
了不了解design pattern;
算法题:手动实现STL的equal_range()
Emmmm这里我用了两个二分做的,实际上操作的时候有一个typo没发现,是边界情况没控制好,所以调试的时候调了很久,最后有小bug,只能口胡说一说思路,讲一讲写出来的代码然后过去了。
算法题:给定有序的整数序列A和B,求序列A和B merge以后的中位数。
这个题我想了一个(logn)2的做法,思路是:对任意一个数x,我可以用二分确定x在序列A中排第几,B中排第几,所以可以用logn的代价来判断x是否为中位数。那么我对通过二分去枚举x即可。
面试官最后说有个logn的算法,是和数学公式有关的。。。没有再深入研究
(这里斗胆质疑一下面试官算复杂度的水平。。。竟然认为(logn)2的解法和n的解法是一样的。。。)
二面结束以后接到HR电话,说一会儿15:00有三面。
三面同样是自我介绍开始(面试官的头像明显比前两个帅多了);
三面只做了一个算法题:
给定一个整数序列,A和B两个人轮流取数,每次只能取最左的数或最右的数,两个人都想使自己的和尽可能大,问给定序列以后A和B能取到的和各是多少。
这个题乍一看是一个博弈,但是仔细想了想发现博弈的一些常见算法都没法用。考虑到A取完以后相当于得到了一个新序列并让B来取,我一开始想到的思路是用递归做。
递归写完之后面试官认可了正确性,但是要求优化。我在递归的基础上加了记忆化,把理论复杂度降到了n2。但是面试官还坚持要继续优化。
最后根据递归写了一个DP,最后把DP写出来了,DP的循环方式和正解有点不一样,但是正确性还是得到了验证。
三面就结束了,面试官的评价是:最后做到这个地步,已经可以了。
当时觉得希望还蛮大。
微软的三场面试是最累的,直观感受其实还是蛮适合ACMer的,不需要工程经验,都是以做题为主。当时觉得面得还不错,但是总归是人外有人,也可能上海的竞争比较激烈,从HR的反馈来看应该是进了备胎池,一直没有发拒信,打电话问也还说有机会,但是至今也没等到offer。
6. 爱奇艺(测试开发,远程,完成3面)
爱奇艺的面试是4.27收到的消息,约了5.4面试。
5.4 一面:
自我介绍;
C语言怎么生成随机数;
一个gcd()函数,怎么设计测试样例;
对测试有哪些理解;
聊了一些课程的东西;
一面就这么没了,总共才二十多分钟,给人的感觉就像是认认真真准备了高考,结果上场考了小学题。下午接到电话,一面通过,约了二面时间。
5.7二面:
自我介绍;
课程和课程设计;
介绍了一下ACM竞赛的经历;
进程和线程的区别;
有没有了解过一些自动化测试框架;
TCP三次握手;
C++多态怎么理解;
黑盒测试和白盒测试分别是什么?各自优缺点?
差不多就是这些,可能有一些遗漏,因为问的问题都比较零碎。
二面感觉有点凉,面试官还根据我对ACM的描述得出结论:ACM竞赛是一个可以通过刷题提升的比赛。。。结果最后5.10接到电话约了三面。因为之前对自动化测试的框架完全不了解,所以突击了一波loadrunner和robotframework。
5.11三面:
自我介绍;
然后强行自己把话题带到了robotframework上,表示了自己临时去了解了一下。
问了一些robotframework的问题:分层的思想、定位之类的;
聊了一些课程设计;
进程和线程的区别;
子进程是什么;
为什么要引入线程而非子进程;
软件设计的生命周期;
用Python写过什么;
C++的多态;
什么是内存泄漏;
怎么测试内存泄漏;
聊了一下做测试需要的品质;
自己的优缺点;
后面的也记不清了;
最后说如果有offer会在一周内通知。
三场面下来感觉爱奇艺的远程面完全没有考算法题,书上的知识会有一些,但是问的问题都比较零碎,三个都是女面试官(听声音甚至觉得是同一个人),可能是因为没有工程经验所以工程方面也没有问太多。面完之后一周没有收到任何消息,凉凉。
7. 字节跳动(后端开发,现场面,3面完成,offer)
字节跳动是抱着试一试的心情去的,因为前面一路被打击,然后一直听说头条招人门槛高,所以不抱太大希望。
现场面试,三场都在5.19当天完成。
一面:
自我介绍;
上过的专业课;
两个大矩阵乘法,代码怎么写能够跑得尽可能快。
这里我先确认了是否为稀疏阵,因为稀疏阵有一个优化算法。告知按稠密阵计算。
面试官的本意是分块计算,做到尽可能的***友好。但是我没get到这个意思,给面试官讲了一个Strassen Algorithm,可以把矩阵乘法复杂度降到nlog7。
有大约5w个ip地址的列表,输入一个ip,判断这个ip是否在列表中。要求占用内存尽可能少;速度尽可能快。
想了一个排序+二分,似乎还不是最优解,面试官反复提示只有5w个在列表中,意味着99%以上的ip不在列表中。但是最后还是没有想出来,就跳过了。
Linux怎么查看内存限制;(这个我不知道,但是我说网上搜一搜就出来了,面试官二话不说让我搜,两分钟没到给出了答案)
系统调用Systemcall有听说过吗;
还问了一些我没听过的名词,但是都不会,就如实答了不会。
此时感觉自己已经凉凉了,就干脆放下心来抱着学习的心态和面试官聊了聊面试相关的东西,都准备走人了,结果被HR小姐姐按住说一面通过了等二面。
二面:
自我介绍;
算法题:平面上有n个点,输出最多有多少个点共线。
一开始没什么思路,就先口胡了一个O(n3)的暴力算法。后来试探性的得到了正解O(n2)的提示,开始想n2的思路,最后想出来了。然后手写了一下代码实现了。
C++多态;
线程和进程;
TCP三次握手;
TCP是什么层的协议;
迭代器失效了解吗;
大概二面是这些。面试官的评价:能够胜任工作,但是作为科班出身还是需要拓宽知识面。于是二面通过了。
三面:
自我介绍;
算法题:给定字符串s,输出第一个满足:在s中恰好出现3次的字母。保证存在这样的字母且字符串都是小写字母组成。
比较简单,扫一遍开个数组统计,再开个vector存一下就行了。手写代码。
SQL:给一个id,科目;成绩的表,搜索不及格科目大于两门课的学生id。
数据库的事务是什么;
如何实现事务的隔离性;
你觉得后端包括那些东西;
听过web编程吗;
Cookie是什么;
你在登录一个网站时,输入完账号密码点击确定的时候发生了什么;
面试官评价:知识面有些狭隘,局限在课本上,需要拓宽和深入钻研。
插曲:三面面完以后,HR让我等了大约20分钟,然后送我出大楼之前带我到一个小会议室聊了一会儿,大致意思是:面试官反馈不错,希望采集一些相关信息来提升招聘精准度。大概问了一些学校、年级人数、深造/就业比例,身边有多少同学在实习、自己对实习有什么期待/需求。虽然声明了放轻松,这不是HR面,但是感觉还是有一点HR面的意思。
最后告诉我1~2周会有结果。终面的面试官给的评价感觉不太好,感觉自己大概率是要凉了,结果周三接到电话说面试通过了,是否发offer需要评估。周五送上去审批,周一等到了offer。
一些Tips:
1. 基础比较重要,相对看中的专业课有:操作系统、计算机网络、C++。可以看出,这么多场面试,有几个点:“C++多态”、“TCP三次握手”、“进程和线程”是被多次提到的。作为科班学生需要在课堂上打好基础;如果像我一样基础不那么扎实,在准备面试期间有必要回过头去review一下教材和ppt。
2. 自我介绍。这是每场面试的开头。虽然技术岗位可能自我介绍的作用不是那么大,但是某种程度上你在自我介绍、简历里面提到的东西会很大程度上决定面试官的提问方向和整个面试的走向。个人觉得技术岗位,大致讲一讲简历上的内容带过是可以接受的,但是能有一些简历上没有的东西,并且让人眼前一亮的话可以算作加分项。
3. 要适当去主导面试。面试不是简单的一个面试官提问,面试者回答的环节。作为面试者,我觉得要主动去掌控整个面试的节奏和方向。通俗的讲,我需要主动去告诉面试官我会什么,我擅长什么,引导面试官从我掌握的内容里去提问,而不是等着面试官抛问题。没有工程经验的我在前几场面试(腾讯提前批、网易)都非常吃亏,就是因为没有意识到这一点,而面试官就只能按照他自己擅长的方向来提问了。
4. 这是和超nice的头条一面面试官最后聊天阶段了解到的。在进入leader面之前,面试官的提问可能会更倾向于自己部门工作相关的东西。所以一般来说很少能把所有的问题都答上来(大佬直接忽略这一条),被问住了或者碰上完全没听过的东西也没关系,大方承认就好。在前期(一面、二面等)的回答中能有一两个impressing的闪光点就有机会通过了。
写在最后:
从时间线上看,从2月投递第一份简历到现在,整个春招在将近100天之后总算是画上了句号。第一份实习确实挺难找的,尤其是4~5月份看到牛客网上面各种拿了五六个offer求比较的大佬帖子,给自己也带来了很大的压力。最大的心得应该还是never give up吧。很多时候能够改变整个结局的转折点就在不经意之间。感谢牛客网和牛友,拿到第一份offer还是蛮开心的。
#春招##面经##实习#