从开始准备简历撰写,到现在基本确定实习岗位,晃晃忽忽过了大半个月。半个月说长不长,说短不短,但绝对是我这20年来最难忘的历程之一。其中经历的心态上的大起大落,只有当自己真的置身其中,才能有所体会。写下这篇博客,一来记录自己第一次应聘岗位的心路历程,二来也是想记录下几轮笔试面试的题目,希望能对各位小伙伴们准备后续面试有所帮助。
我大约从3月1日开始准备简历,当时李力通知3月7号交第一稿,给实验室的学长学姐们修改。开始的几天,完全没有头绪,不知道该从哪里开始下笔。最后胡乱挑了WORD上的一个看着还顺眼的联机模板拿来改。 于是有了现在看来不堪入目的第一稿……(每稿简历的修改我都保留了备份,现在回头看来也算感慨颇多)
这稿简历当时自认为还算简洁,但却被学长学姐挑出了一堆毛病,才知道原来自己有那么多细节没有注意:
大体要点就是这些,都是些容易忽略的细节。在学长学姐帮助下修改了若干稿后,得到了我在后续投递中使用的终稿:
简历是职位的敲门砖,还是需要花时间反复修改推敲的。我相信这份反复修改的简历在我的整个应聘过程中,起到了很大的作用。
其实严格按时间顺序,我是先接到了阿里的电话一面,然后才参加的去哪儿网笔试。但为了逻辑清晰,还是把去哪儿的笔试提到前面来写吧。
去哪儿网的简历网投其实开始的挺早,但需要在中华英才网上填一个巨繁琐的表格……我当时其实算是相当早开始填写的,但特别逗比的拖到了截止当天下午6点才提交(该死的拖延症),而后来发现去哪儿下午6点20就在官微上发布了“笔试邀请函发放完毕”的微博。于是我妥妥的没有收到邀请……
怎么办?果断霸笔呗!
去哪儿要求携带学生证和笔试邀请邮件打印稿前往西安交大笔试。因为我的确有提交简历,所以也有了一个“简历编号”。于是果断把小伙伴们的笔试邀请邮件拿来,“稍作修改”,自己给自己发的邀请函就火热出炉啦。早上10点,实验室小伙伴们结伴向交大进发。
印象非常深刻当天是3月8日妇女节。恰逢周末,路上堵得不行(中国人总是有把任何节日过成情人节的能力)。 经过一小时的士上的颠簸,即将晕车吐出来的时候,我们终于到了……找到笔试教室,发现门口一堆霸笔的人被拦下HR不让入场。但HR只会对照打印的邀请函,根本没有签到表或联网查询编号来验真伪,于是成功凭借伪造的邀请函混了进去!
当天笔试是开发与测试同一份卷子,开发做1,2,5三题,测试做3,4,5三题。题目并不能算难。
1、要求实现一个函数,对于给定有序整型数组以及一个给定整数,若整数存在于数组中,输出其位置;否则输出其应被插入的位置。例:
[1,2,3,4,5] 4 --> 3
[1,2,3,4,5] 6 --> 5
[1,2,4,5] 2 --> 1
[1,2,4,5] 3 --> 2
这道题就是一个简单的二分查找,时间复杂度O(log N)。当然一般的顺序查找也可以但O(N)解法对于这道题目来说有点太水了。我当时懒得写循环,直接4行递归写完了查找函数,然后再用要求实现的函数调用自己写的查找函数。唯一一点棘手的,是题目给的函数声明并不包含数组长度。如果是java,可以很方便的用.length()方法获取数组长度,但C就无能为力。其实去哪儿内部大量采用JAVA,因此笔试暗示用JAVA解题也不无道理。但因为自己对JAVA并不熟练所以整套卷子仍然用C答。这里我只好随意声明了个长度变量,随意用sizeof赋了个值(当然肯定是没用的)。当时只希望改卷的人不要纠结这种细节。
2、给定两个文件,格式如下:
1.txt
学号 科目 成绩
1001 数据结构 79
1002 编译原理 85
……
2.txt
学号 学院 专业 姓名
1001 计算机学院 软件工程 张三
……
要求输出每个专业总分排名第一的人的姓名,有挂科的不算。
这道题目是三道题目中最为麻烦的一道。我当时的想法是这样的,两个文件以学号为单位交叉比对每一个人并求出总分,需要M*N^2(假定N人M科),显然过于麻烦。因此首先按行读入第一个文件,将学号进行哈希(当时时间紧张直接注释这一思路并直接用f(x)=x作为哈希函数)把成绩加到哈希后总分数组相应元素中。至于挂科,我的处理是碰到<60的单科分数直接把总分减去INT_MAX来将其排出。
而后读入第二个文件,因为输出的是专业排名第一,所以学院信息直接忽略。同样哈希学号来得到每个学号对应的姓名和专业名。而后根据专业(第一关键字)和总分(第二关键字)进行双关键字的快排(只需重写compare函数就可以了,优先比较专业,相同专业比较总分)。这样得到按专业排序,同专业分数递减的结果。输出只需遍历一遍,专业名和前一个人不同的输出姓名,否则continue。求总分O(N*M),映射姓名和专业O(N),排序O(N log N)。因此总时间复杂度为O(N*M)和O(N log N)中的最大值,小于朴素的O(N*M^2)。
C语言实现的代码,整整写了正反两面A4纸……最后时间紧张还把快排失误写错了一点。
3、给第一题写测试用例。
因为没有专门研究过测试方法,我就按我的思路分了几类:
共3级12类测试用例。
90分钟,我掐着点做完交卷。 当时感觉还行,至少把能展现的能力都尽量展现了。而后来也成功接到了笔试通过,等待电话通知面试安排的短信,说明结果也是不错的。这场笔试为我树立了比较大的自信。 也让我对霸笔霸面不再有那么强的紧张感。
360的职位是实验室学姐帮助内推的,系统部,负责360的底层技术和大数据平台。 当时是在一堂“跨文化交流”课上,突然来了一个010开头的电话,一看来显猜测是360的电面就赶忙出来接了。
这是我整个应聘过程中感觉发挥的最差的一场,以至于面完后我一度认为自己没有通过的希望。
面试官是典型的按简历一条一条向下过的面试思路。他注意到我的获奖经历中有提到ACM-ICPC(虽然只是一个水水的Honorable Mention,可见企业对于ACM竞赛经历是多少看重 ),技能中又提到了算法与数据结构,因此直接从数据结构开始问。
第一个问题,描述一下如何建立一棵二叉树。
这个问题我就有点蒙,建立一棵树,这怎么说啊?我回答这要看具体的问题需求还有输入数据的格式,可以按照线性存,用2n和2n+1存左右孩子;也可以按链式存,节点以指针相连建树。
第二个问题,非递归遍历二叉树。
脑子里直接蹦出栈了,但是因为电面太突然,脑子一下有点白,愣是没描述清楚具体过程,吭吭哧哧卡了一会儿,才说出先 压树根,而后每出栈一次,将非空的左右孩子入栈。直到栈空,遍历完毕。
第三个问题,给出不重复但不保证全部出现的1~10亿间的自然数,进行排序。
面试前没有准备大数据类型题目,其实这是一道很经典的题。我当时只能回答,可以用桶排的思想,先将数按高位分为若干个文件,再依次细分文件,外部排序。或者使用外排归并。面试官直接说,直接读内存放不下,外排磁盘IO过高。我想了一下没想出其他方案,最后面试官告诉我用bitmap……这个问题回答的不好让我一下对这场面试更加没信心了。
后面就是快速过了一下我简历上的每一个项目。当时因为先接到阿里的一面电面,面试官会抓着项目某个技术点深挖,因此当360面试官问我某个项目时,我只是很笼统的概述了一下,等待他问具体技术细节。没想到他竟然就这样很快的过掉了简历上的三个项目,没一个问到技术细节。又问了“何时能入职”等常规问题,而后直接跟我说等待通知,结束了面试。也没问我是否有问题要问他。整场面试只持续了13分钟,出奇的短。这也直接让我对这场面试的结果失去了信心。心情瞬间跌到谷底。 这些题目根本不算难,甚至可以说相当基础,但我却答得不好……
没想到次日内推的学姐就告诉我面试结果不错,通过了,并且没有后续的技术电面,只要等HR和我联系就行了。
这个结果大大出乎我的意料,但也是我通过的第一个职位,给了我很大的鼓励。
下面就是阿里的三轮技术面试了,因为过程较长内容较多,同时也是这段时间的主要内容,后面单开一篇博文写。有兴趣的读者可以继续阅读下一篇博文《实习应聘记(二)——阿里,总结》