原文:http://blog.csdn.net/qq_24369113/article/details/70432185
作者:木子-勇士心
个人情况
本人是武汉大学计算机学院2014级的本科生一枚,在写这篇总结的时候我是大三。本来我们班是规定了有固定的实习的,但是自己还是想向国内顶尖的互联网公司冲击一下,所以抱着试一试的想法参加了几个公司(腾讯、阿里、华为)的暑期实习生招聘。在腾讯应聘的职位是后台开发实习生,阿里和华为应聘的是Java开发实习生。
本文目的
这里想记录一下几个公司的暑期实习生招聘的流程以及一些常问的问题,一来是自己总结一下经验为以后可能的面试做准备,二来是想给以后的学弟学妹们一个参考,在准备面试的和笔试的时候能够做到有的放矢。
结果
在2017.4.16是面完了腾讯的HR面,目前还在等结果(不知道是不是进了备胎池,一周没有消息了OTZ),微信显示的是“你已完成所有的面试环节、请保持手机畅通”。
在4.14面完了华为的面试,今天刚刚接到华为的短信通知说进入了签约池,叫我填一个什么调查问卷。
阿里的内推比较早(大概三月份开始的),后面接过一个面试电话然后显示已回绝,但是貌似4.26有自主投递的笔试,过了笔试之后还可以有面试机会。
———华丽的更新线————
今天(4.24)收到腾讯发过来的邮件啦,开始准备暑期的实习咯
首先简单介绍一下华为和阿里的情况
(如果只想看腾讯的就直接跳过这一节吧)
华为:
华为在武汉的是实习生招聘面试是在华为武汉研究院(一个三环外老远老远的地方),前期需要自己在华为校招的官网上填写自己的简历,然后一段时间后(大概两周)会收到笔试的通知。 华为的笔试是三道编程题 ,总分600分,分值貌似分别是100、200、300,时间是总共两个小时。个人觉得题目难度不算是很大,但是想全部做对好像也不是那么容易。笔试完成大概一周内就收到了叫我去面试的通知。(不过有的同学没有做笔试也收到了面试通知,估计是部门内推就可以免除笔试)个人感觉华为的笔试貌似没有刷人,因为我的同学只要填了简历都获得了面试资格。 笔试过后就是面试环节了,地点前面说了是在很远的一个地方,从我们学校搭公交过去大概要两个多小时。华为的面试总共只有两轮,第一轮是技术面,第二轮好像就是HR面试了,然后时间是在同一天里(可能考虑到那地方真的太偏远)我大概花了30多分钟就完成了两轮面试。 技术面试的时候问的主要是项目中的一些问题,主要问题有: -你印象最深的一个项目是哪一个,介绍给我听一下 -hashmap的结构能不能画出来给我看看 -平时有没有使用过Linux,一般用Linux干啥,常用命令有哪些 -平时用过哪些数据库 -有没有使用过云服务器(我说我用的腾讯云....) -有没有什么想要问他的 反正个人感觉技术面还是比较简单的,如果自己做过项目而且真的比较熟悉自己的项目的话问题应该不大。而且感觉技术面好像没怎么问技术细节问题(相比于腾讯和阿里)。 接下来的是HR面试,刚面完技术面还没坐下来就通知我去HR面试。HR面试的个人感觉主要是做些背景调查。主要问题如下: -你最新的一个项目介绍给我听一下 -你的成绩怎么样,在年级排名,你们这个班是特色班吗 -你是哪里人,高中在哪个学校,高中成绩怎么样(不知道为啥要问高中....) -家里有没有人在华为工作 -你认为你个人的最大优点是什么 其他的问题记得就不是很清楚了,反正总体感觉华为的面试还是比较简单的,涉及到技术层面的问题不多,更多的是叫我谈项目相关的东西。而腾讯和阿里的技术面就会涉及到很多技术问题了,下面会一一介绍。
阿里:
阿里的内推和面试时最早的,大概3月份就开始了。然后阿里的内推也是最多的,然而我还是跪了(无奈.jpg) 阿里也需要在阿里的校招网站上进行注册和简历填写以及岗位的申报。然后过了一段时间后会收到一个邮件叫我完成综合素质评测和编程测试。这个综合素质评测考的东西真的是啥都有:阅读理解、逻辑推理、管理协调什么乱七八糟的都有,总的来说就是一个IQ和EQ以及领导沟通能力的综合测试,时间大概是一个小时。然后还有一个编程测试,30分钟一道题(我花了25分钟才大概看懂题意,最后就随便写了几行代码就提交了......)。不过官方说编程测试仅供参考,不影响结果。 然后大概过了一周左右的时间突然有个杭州的电话打过来,我还以为是我在淘宝买了啥东西,接了电话才知道是面试(猝不及防)。由于没有怎么准备,所以回答的很不理想,上午接的电话下午官网状态就显示为已回绝了。主要问的问题有: -介绍一下你项目里用的这个Dubbo框架。(这个是我实习的时候的一个项目,事前没咋准备,也不是很了解,所以只能说我不知道。。。) -解释一下Hashmap如何实现的 -你之前做过的项目里有什么缺陷,如何解决 -如果给你足够的资源和技术如何优化你之前的项目 -快速排序如何实现
由于阿里这个面试过去的时间太长了,已经记不太清了,但是通过这次面试我总结出了一些经验,这也为我之后的面试起到了很大的帮助。
- 简历上的东西自己一定要非常清楚,自己做过的项目在面试之前一定要过一遍,你的负责的部分、有哪些创新点、还有那些问题。这些都是需要复习一遍的。
- 一些基础的算法和数据结构要知道,比如快速排序的思想、链表结构、hash原理、等等,这些很有可能会被面试官问到。
腾讯
终于说到腾讯了,腾讯的招聘给我的感觉就是豪。貌似腾讯包下了一整个酒店(光谷凯越酒店)来面试,而且好像每年都是那个酒店,据说那个酒店还是五星级的。
还是先从简历投递说起吧。腾讯的实习生招聘是从我们年级的群里得知的。时间大概是三月中旬,当时有一个学长内推,我给学长的邮箱发了简历,然后也在腾讯的官网填写了自己个人的简历和各种情况,但是一直等到四月4号都没有人打电话给我面试。(这通常是简历在内推阶段被刷了,我们班有两个大神在3月份就接到电话面试然后顺利拿到了offer)
内推阶段被刷的我只有老老实实的做笔试题,腾讯的笔试题好像是两个小时。在正式的笔试题之前还有一个模拟考,供大家熟悉考试题型和环境的。腾讯的考试题分为选择题、简答和编程题两个大类。选择题的范围比较广,数量好像是30个,而且好像有时间限制要在一小时内做完。内容包括有c++、Java、数据结构、网络、Linux、计算题还有一些记得不是很清了。反正感觉是有很多不会做的,但是个人感觉做这种笔试题有时候不能真的去硬算,有时候可以使用推理和排出的方法来做,否则感觉基本不可能在有限的时间内算完。然后是四个大题,两个是简答题,两个编程题。一个是有关磁盘空间计算的问题,我好像没有做出来,瞎写的。然后第二题是一个简单的算法题,我直接写出代码放在上面了。第三题是一个排序平衡二叉树的问题,但是当时好像把题看错了,然后没有写出来。最后一个题好像是一个格式化输出字符串的问题。比较有把握的就是2、4两个题,1、3题就随便写了几句话然后就交卷了。
不过虽然感觉笔试做的不是很好,但是在一周后还是拿到了面试的通知。(好像笔试不会怎么刷人,我认识的大部分的同学好像做了笔试就都拿到了面试机会)。面试分为三轮,一二轮是技术面,最后一轮是HR面试。腾讯的面试是在华科旁边的一个酒店里,比较人性化的是每个地方都会有工作人员指引,还有工作人员帮忙按好电梯的楼层,给人感觉很贴心。到了酒店之后是在大厅用微信扫描二维码签到,然后是在休息区等待。到自己的时候会有短信和微信消息提醒。上去面试的时候才发现原来是每一个面试官有一个房间,就是他们住的那房间,然后不同的人在不同的房间里进行面试,给人感觉就是腾讯好有钱。
一面的面试官是一个男士,个人感觉像个领导,因为穿的挺正式,不过一般应该是技术人员。首先是叫我做了一下自我介绍,然后就问我一个C++的多态如何实现。因为平时用的都是Java,对C++不是很了解,所以就随便说了什么多继承什么的,然后告诉面试官我对C++不是很了解,平时主要用的是Java。然后面试官就开始问我Linux有关的问题:Linux进程和线程的区别、Linux进程间通信的方式、Linux的文件系统、Linux进程的创建以及创建后父进程和子进程之间分别会发生什么。问完了Linux他又问了我Java相关的问题:让我介绍了一下Java的垃圾回收机制;在纸上写一个Server通信的示例程序,我写的时候还专门写了一个处理线程类,然后还加了一个终止程序运行的条件标志(我感觉面试官可能会比较看重你考虑问题是不是全面);然后还问了我Java中hashmap的实现(好像这个问题出现的频率很高)。接着问的是网络方面的问题:TCP的三次握手和四次挥手画出图示并讲解,说出Http的包头里的四个属性,说出http有哪些方法,post和get有什么区别(反正这个问题我回答跪了,看到面试官画了个×)。上面那些问题问完差不多就过了20多分钟了,然后面试官叫我10分钟内在纸上写一个算阶乘的程序。我第一反应就是肯定普通的数据类型会溢出,然后我就问面试官输入的数据有没有范围限制,他说没有。我当时就想肯定不能直接用int 或long,肯定是string来输出结果,然后愣了大概一分钟如何去计算。后来我突然想到以前自己写的一个大数相加的程序,然后我就想把所有的阶乘转换成加法的循环具体可参考以下代码。(已经过测试应该是没有问题的)
#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; string addString(string sa,string sb)//实现大数相加 { vector<int> a; vector<int> b; int small=min(sa.length(),sb.length()); //获取最短长度 //将字符串里的每一位都保存到vector数组中 for(int i=0;i<sa.length();i++) { a.push_back(sa[i]-'0'); } for(int i=0;i<sb.length();i++) { b.push_back(sb[i]-'0'); } //将a,b两个数组逆序,也就是让个位都在0,最高位都在最后 reverse(a.begin(),a.end()); reverse(b.begin(), b.end()); vector<int> result;//保存结果的集合每一个数表示一位 int jinwei=0;//进位初始为0 int i = 0; for( i=0;i<small; i++) //从个位开始依次处理,直到一个数组处理完成,注意进位的问题 { int tem=jinwei+a[i]+b[i]; if(tem>=10) { result.push_back(tem%10); jinwei=1; } else{ result.push_back(tem); jinwei=0; } } if(i<a.size())//判断还有没有剩下高位没有处理,同样要注意进位问题 { while(i<a.size()) { result.push_back((a[i]+jinwei)%10); jinwei=(a[i]+jinwei)/10; i++; } }else if(i<b.size()) { while(i<b.size()) { result.push_back((b[i]+jinwei)%10); jinwei=(b[i]+jinwei)/10; i++; } } if(jinwei==1)//最后判断还有没有进位 result.push_back(1); reverse(result.begin(),result.end());//将result数组逆序,将高位放到前面低位放到后面 string rt=""; //将数组中的数据变成字符串返回 for(int i=0;i<result.size();i++) { string tem=to_string(result[i]); rt+=tem; } return rt; } string function1(string in) { if (in == "") return ""; if (in == "0" || in == "1") return "1"; long long end = atoi(in.c_str()); string sum = "1"; for (long long i = 2; i <= end; i++)//控制乘法的循环次数 例如3!=1*2*3,因为sum初始为1,所以需要计算两次乘法 { //3!=1*2*3=(1+1)*3=(1+1)+(1+1)+(1+1)=6 string tem=sum; for (long long j = 1; j < i; j++) //加法循环实现乘法 例如2*3=2+2+2 { sum = addString(sum, tem); } } return sum; } int main() { string in; cin >> in; cout<<function1(in); system("pause"); }
然后十分钟过去了,我大概把addString那个函数写了一大半,然后把纸给面试官看,然后还大致解释了一下我的思路。后来发现这个题其实有更加高效的做法,使用vector来存储数据,然后模拟手工计算的方式来做大数相乘。具体的代码可以借鉴大数相乘算法实例。然后到此一面就结束了,个人感觉回答出了大概70%的问题吧,但是不怎么抱太大的希望。
让我没想到的是两天后我居然接到了二面的通知。二面是一个比较胖的面试官,网上说一般都是部门的leader,不过我觉得他反而更加的随和像一线程序员哈哈哈。上来他就给我一张纸叫我写一个双向链表删除一个节点的代码。讲道理在纸上写代码体验真的差,而且我总觉得这么简单的题可能会有什么坑…..想了一分钟貌似也想不出什么坑然后就吧唧吧唧的写完了给面试官看,面试官叫我解释一下我的代码,然后问我还有没有什么补充,通常这就是说代码里有bug或者没有考虑到的情况。果然我只注意了删除的节点是头结点的情况而没有考虑到删除的节点是尾结点的情况。加了一个判断条件后又向面试官解释了一下。然后他就给我看一道C语言的变量的空间分配的问题是有关union里有好几个int、double、char类型的数据,然后问sizeof(union)是多少。讲真这个问题我大一学过然后早就忘了,然后我又重复了一遍我对c和c++不是很熟悉,平常写的都是Java。面试官居然说腾讯的后台都是c++写的,没有Java岗。我想这下应该是GG了。不够好在他说没有关系,然后又叫我画了一下TCP三次握手的图示以及可能出现的Timewait的位置和设置这个的原因,当时我还卡了一下,好在仔细分析了一下正确的回答上来了。接着他问了一个最简单的动态规划问题:“每次只能上一级或者两级台阶,上到n级有多少种方法?”解答看这里。
然后就叫我介绍一下自己印象最深刻的一个项目。我如实介绍了一下,然后他问了一些和项目相关的问题,最后他还给我的项目中没解决的问题提供了一些意见。然后最后他说我可能需要未来一段时间学习一下C++,然后还要考虑一下自己未来的技术方向的问题。这下我又感觉好像还有点戏。然后到此二面就结束了。总体感觉二面的面试官非常的和蔼可亲,叫我的名字的时候还没有带姓,就给人一种很亲切的感觉。
很快当天晚上我就接到了短信通知我第二面去HR面,真的是感觉很幸运。HR面试就基本没有涉及到什么技术问题了。主要问了我一些其他方面的情况:你觉得你有哪些优点、哪些缺点、你从你的项目中学到了什么、有没有什么例子能够证明你刚刚说的那些个人特性。巴拉巴拉说了一大堆,然后还和我介绍了腾讯的文化和价值观,然后还给我提出了一些建议和面试方面应该注意的问题。总体的感觉也是比较轻松愉快的,最后他还起身送我离开了面试的房间,让我比较感动。哦他还问了我有没有拿到其他公司的实习offer,我不知道这个问题怎样回答算比较好,但是我还是如实的回答了我参加了华为的面试。
到此腾讯的面试就完成了,总体给我的感觉是比较人性化和比较轻松的。面试官感觉也都是比较和蔼亲切的,一些小的细节真的能够感动人。
最后放上自己的一些感悟和总结吧:
- 面试的时候尽量保持放松的心态,稍微显示出一点自信最好。最好不要自黑啊、贬低自己啊或者遇到一个问题想都不想说我不会。遇到不会的问题也要尽力去用自己已有的知识去思考解决,实在不会的可以如实和面试官说我没有学过、我记得不是很清楚。同时也不要过于放纵或者跟面试官开玩笑什么的,我室友就是跟面试官开玩笑然后就挂掉了,毕竟我们是在面试不是在茶余饭后的聊天。
- 面试的时候最后如果面试官问你有没有什么想要了解的,如果自己实在没有问题想问,可以叫面试官给自己之前的面试提一下意见和建议,这样也有利于自己的提升;或者叫面试官指导一下自己之前没有问答上来的某个问题,这样能够体现出自己比较好学;或者可以问问面试官自己应聘的职位除了技术能力之外有没有什么其他方面的要求,这样可以体现出自己对该职位比较感兴趣并有意愿为之努力。
- 就我感觉一般面试官叫我在纸上写代码的题大多不是很难,但是可能会有坑。例如大数阶乘的溢出、双向链表的首尾节点的特殊处理等。感觉面试官主要考察你的代码和算法能力之外还在考察你考虑问题是不是足够周到,在面对真实地开发环境时代码的鲁棒性是不是足够强。
- 对于应聘开发岗位的同学(特别是Java开发)在准备面试和笔试的时候,Linux的基本原理、数据结构、网络里的TCP和UDP、hashmap、Java的垃圾回收、Java的内存模型、Java的多线程安全问题、http的相关知识几乎是必考的,所以大家要认真着重复习。
- 还有就是面对面试官尽量要诚实,因为一旦你说谎被识破了那铁定使没戏了,所以对于不知道的问题还是不要不懂装懂的好。
- 最后就是保持一颗平常心,能够过面试就为接下来的继续努力,不能够过也要坦然接受。然后继续尝试其他的机会,毕竟世界上不是只有一条路,机会总是留给有准备的人的。
好久没有手打那么多字了,这片面经就到此为止吧,可能还有一些不完善的,等我想起来再补充。希望能够给后面的同学带来一些帮助~