冬季实习面试记(一)

Posted by zixuan-zhang on December 6, 2014

距上次博客更新已经过去很长时间了。上篇文章我非常诚恳的对自己研究生的生活尤其是研一的生活做了较为详细的安排,明确说明了目标已经应该做什么。其中很重要的一条就是经常写博客。从结果上来看,这项任务完成的不好,一方面是由于研究生的课程还是蛮紧的,另一方面是自己还是没有写博客的习惯。其实在选择做事情的时候,我们总说自己忙忙忙没有时间,其实不是没有时间,归根到底是优先级的问题。接下来需要把写博客的优先级提高了。

好了,言归正传。在研一的规划中,我明确把实习经历作为重要的目标之一。在经历了一大波考试后,终于能闲下来一些时间了,所以打算利用闲置的时间扩充自己的实习经历,于是乎开始投简历。投的公司基本上都给面试机会了,但是由于学校地理位置的缘故,进一次京城并不容易,学校里还有一些课程,拒绝了一些公司,并且把想参加的面试都集中在了一天。需要在一天之内面试三个公司,也是蛮拼的了。到目前为止面了三家公司,分别是爱奇艺、VMware和搜狗。下面对每个公司岗位分别记录下。

面试详记

爱奇艺-视频搜索组

给这个公司投简历的时候,大概过了一个小时HR就打来电话约面试时间,效率还是挺高的。这次面试并没有安排电话面试,直接进行onboard的面试。

这次面试是我的一次onboard的面试。之前在海豚实习的面试由于是在外地,只进行了两次onsite的面试。所以还是比较兴奋的,也有些紧张。

早上10点,按照约定的时间我到了公司,然后给HR打电话,发现她还没有到公司,看来公司的工作时间也是弹性的。她到公司后直接把我领导一个好小好小的屋子里,只能够做三个人,估计是专门面试的地方。

第一轮面试

这个面试官坐下后也没有要求自我介绍就直奔主题开始提问。问的问题总结起来分为三个大问题。

问题1:信息检索相关知识。

因为我在简历上写了搜索引擎的项目,他上来之后第一个问题就是关于这个项目的。这个项目在我的简历上只排在最后,而且只有简单一句话来描述,所以我并没有想到他会直接问这个项目。后来才发现,他们做的内容就是和这个项目相关的工作。所以这个面试官的目的性非常明确,毫不拖沓。我就简单的介绍了下在这个项目中我的工作是什么,以及是怎样做的。然后他问了一些关于信息检索相关的基础问题:

  1. 索引建立的过程?对新闻进行分词处理,对每个词项出现的新闻的doc-id串起来建立索引。
  2. 怎样进行查询?如果是布尔查询的话。对查询语句中每次词项出现的新闻进行交集处理。在求交集的时候,索引链表的doc-id的比较过程,以及跳表策略是什么样的。对这些都简单的解释了下。
  3. 如果是非布尔查询怎么办?将每篇新闻抽象成向量,将新闻中出现的词项的权值构成向量来代表新闻,将新闻和查询语句做乘积求出新闻的得分再进行排名。词项的权重计算方式是什么样的?可以利用term-frequent, document-frequent来计算。

在问的过程中,问题是一步一步深入的。不过由于问的问题比较浅,在信息检索课程里都学过相应的原理,所以都不是很难,没有被问倒。

问题2:数学题,概率题。

问完信息检索的原理后,出了一道非专业问题,也算是概率问题吧。问题是这样的:

有两个筛子,每个筛子有六个面。其中一个筛子六个面的数字分别是1,2,3,4,5,6,六个面出现的概率相同,都是1/6。另外一个筛子也有六个面,但是这六个面上的数字内容未知,每个数字出现的概率也未知。问题是:怎样设计第二个筛子的六个面的数字以及每个数字出现的概率,使得当掷两个筛子的时候,两个筛子朝上的面的数字之和出现1,2,3…,10,11,12的概率相同。

这个问题说完后对问题不是很理解,并没有什么思路。然后想到一个筛子的数字是1-6,而出现的和属于1-12,所以另一个筛子的数字肯定属于{0, 1, … , 5, 6}。然后分别设这几个数字的概率分别是p0, p1, … , p6。所以有如下公式:

数字和为1的概率为: p0;数字和为2的概率为:p0 + p1;数字和为3的概率为:p0 + p1;……;数字和为6的概率为:p0 + p1 + p2 + p3 + p4 + p5 + p6;数字和为7的概率为:p1 + p2 + p3 + p4 + p5 + p6;数字和为8的概率为:p2 + p3 + p4 + p5 + p6;……;数字和为11的概率为:p5 + p6;数字和为12的概率为:p6

然后还有以下两个限制条件:

  1. 1-12出现的概率相等
  2. p0 + p1 + p2 + p3 + p4 + p5 + p6 = 1

然后结果很显然了 p1 = p2 = p3 = p4 = p5 = 0,p0 = p6 = 0.5。也就是说,这六个面只有两个数字:0和6,出现概率相等,分别占有三个面。

问题3:求两个字符串的编辑距离。

这是一道比较比较经典的编程题,明显可以用动态规划来做。我之前写过这个代码,但是记不太清了,所以慢慢想了想递推公式,最后总算是把递推公式想出来了。

状态:F(i, j)表示又字符串1的前i个字符到字符串2的前j个字符的编辑距离的最小值

方程:F(i, j) = min{F(i-1, j) + 1, F(i, j-1) + 1, F(i-1, j-1) if str1[i]==str2[j] else F(i-1, j-1) + 1}

初始化:F(0, j) = j; F(i, 0) = i

三个问题虽然速度慢点,但基本上都算答上来了。

第二轮面试

这一轮面试比较符合规律。先是自我介绍,然后就开始问项目,各种细节都不放过。我就从海豚实习的项目开始说起,首先介绍了分布式图片缓存系统的主要逻辑是什么等等。在陈述项目的时候,他一直对爬虫感兴趣,比如爬虫每分钟能爬多少?有没有去重机制等等。但爬虫模块在这个项目中不算是核心的功能,我就有点无语了。所以在回答的时候一方面回答他的问题,另一方面也在尽可能的描述整个项目的处理流程。这样可以显得对项目非常熟悉。

之后又对维基百科分类标注系统简单介绍了下。问了爬取的时候有没有bad case?是怎么处理这些bad case的?能抓多少?等等

之后就问了一个算法设计题。从10w个数中找出最大的100个数。这明显也是经典题。我本来想详细点回答这个问题,从效率低的方法到效率高的算法都说一下(从某个面试书籍上了解到的技巧)。所以先说把10w个数排序,然后取出100个最大的数,时间复杂度是nlog(n)。然后又说用最小堆取出前100个最大的数,时间复杂度是nlog(100)。很显然,他对第一种方法很不耐烦,说完第二种方法后他也没再问有没有效率更高的方法。当然,这种数量级的数也不需要特别快的算法了,但是还有一种思路借鉴快速排序可以再O(n)的时间内完成。

就这样,两轮面试就完事了,大概用了一个半小时。

体会

第一轮面试主要问算法和专业知识,第二轮算法主要问的是项目,感觉自己表现的还可以吧,当天就发offer了。在面试的过程中一定要有信心,如果有什么问题一定要及时与面试官沟通。算法水平还是要继续提高的,平时要多练练在纸上写代码。在问自己做过的项目的时候基本上没遇到什么坎,只要是自己做的就基本上没有问题,在描述的时候还是要显得高大上一点比较好,多提一些自己做的比较好的地方。

VMware-网络驱动测试

这个公司的面试经过了一轮电话面试和两轮onboard的面试。

电话面试

  1. 简单介绍了自己在海豚实习时做的分布式图片缓存系统的项目。
  2. 因为在工作中主要用Python写测试脚本,所以问了些Python相关的基础内容。
  3. 问了些Linux基本操作的问题。查看进程命令?查看内存命令?解压文件命令?
  4. 问了些底层网络的问题。怎样判断TCP报文?HTTP的端口号? 电话面试问的问题都是比较基础的,和工作内容有关的问题。

第一轮面试

  1. 将分布式图片缓存系统用Python代码将逻辑简单写出来。一方面是考自己对项目的理解,另一方面是考Python使用是否熟练。关于项目的问题基本问不倒的,面试官能想到的自己在做的时候也想过了。
  2. Linux、网络相关内容。怎样用命令配置网络?给一块新的硬盘(没有文件系统)怎样使用?TCP三次握手的过程?如果一个子网内的主机一开始能访问另一个子网内的主机,后来又不能访问了,问题出在哪?这些内容以前基本没有接触过,所以我只能说不会了。最后一个问题也只是给出了自己的大体思路,估计回答的也并不能让面试官满意。比如先ping网关看看是不是自己的主机问题,然后使用traceroute命令查看到哪出的问题。
  3. Python相关的知识。怎样在List中找到重复的值?都有哪些数据类型?哪些可变,哪些不可变?怎样判断是否可变?
  4. C语言回调函数是什么,有什么功能?因为我对回调函数的理解不够,只是之前在写程序的时候用到了,所以就直接跟他讲当时遇到以及使用的情况。

第二轮面试

第二轮面试和第一轮面试基本上是一样的,大体的方向都差不多,就不详细写了。

体会

首先,面的这个岗位是对网络、存储设备做测试,所以需要三方面的知识:Linux、网络、Python,面试过程中的问题基本上属于这个范围。由于自己对网络知识掌握的不是特别好,所以很多问题都被难住了。不过我觉得这些问题都是可以利用搜索引擎在短时间内掌握的,自己认为在工作过程中这并不能成为一个坎,考察的这些内容我觉得不能很好的学习能力。也算是为自己找借口吧。

因为做的是测试,所以对编程、算法能力要求不高,在面试的过程中都没有涉及这些内容。

总的来说公司很好,但是工作内容不是很喜欢,公司蛮想进的,虽然水和福利都不错,但是职位不喜欢,不觉得写测试脚本对自己的能力有多大提高。自己的表现还好吧,不知道最后结果怎么样,但是无论如何都不会去的。

搜狗-营销事业部

第一轮面试

  1. 基础的Linux命令。怎样在当前文件夹写查找*.txt文件?怎样用命令在文件夹中的文件中查找包含”.txt”字符的文件?怎样列出文件的行数?文件中内容以行为单位,怎样列出没有重复的那些行内容?最后一个问题没有答出来。
  2. 基本的编程题。写一个函数,将字符串转化为int型。需要考虑的异常还是蛮多的,比如是否包含非法字符?结果是怎样传递的,通过返回值还是通过参数?返回值的设计是什么样的?需要考虑是正数还是负数。总之需要各种鲁棒性的考虑。这道题写得不是特别完美,有几个点没有考虑或者考虑的不是很好。
  3. 数据结构与算法。怎样用栈来实现队列的功能?需要考虑入队列和出队列的情况,简单讲就是stack1负责入队列,stack2负责出队列。如果如队列时stack1满了,就将stack1的内容导入stack2;出队列时如果stack2为空,则将stack1内容导入stack2。这个题回答的还算可以吧,大体思想基本都说出来了。
  4. 数据结构与算法。如果想在栈中记录最大值和最小值怎么办?这个问题我回答的是分别使用两个变量存储最大值和最小值。入栈时更新最大最小值;出栈时如果出的是最大值或最小值则遍历栈得到当前的最大或最小值。这个问题是这么回答的,不知道有没有更高效的方法。不过回答完后他也没有问有没有更高效的方法。
  5. 项目简单问了下。在分布式图片缓存系统的时候是怎样使用MemCache的。如果插入的内容查过了MemCache的容量怎么办?这个我就直接说的,因为我们的服务超过阈值的可能性比较小,所以没有对这个异常进行特殊处理。如果超过的话就直接从文件系统中去获取图片。

第二轮面试

  1. 这一轮面试主要是问项目了,都是问的我在简历上写的在海豚实习时做的项目。没什么可说的了。
  2. 让写一个二分查找的函数。很简单,不说了。

    体会

    这次面试和爱奇艺面试的过程基本差不多,第一轮是面算法专业题,第二轮主要问项目。这个面试问题的问题都比较基础,很接地气,不涉及复杂的算法题。在纸上写代码的能力还是要提高的,编程水平很重要啊。

另外之前做的项目用Python比较多,这个部门基本上都用C++,有一个问题问希望用Python还是C++。我认为语言不是问题,需要看工作的需要了。自己对Python更加熟悉一点,但还是非常乐意去加强其他语言的水平的。对个人而言,还是更加喜欢Python一点。

这次面试也是蛮快的。两轮一共用了一个半小时吧。感觉也问题不大吧。

过了一周发邮件通知被拒了,原因如下:你的良好的基础知识给我们留下了很好的印象,但由于项目经验与我们业务不是很契合,还有名额所限,所以很遗憾的通知你没能通过我们的面试。

好吧,我知道还是不够强大。继续努力!

后记

以前都没有经历过onboard的面试,这次一下子面了这么多还是很兴奋的。面试过程感觉还好,没有遇到什么特别难一点思路都没有的问题。增加自己的面试经验还是不错的,可以更明确自己平时努力的方向。

实习还是要继续找的,简历还是得继续投的,面试还得继续参加的,聊一聊还是蛮爽的。总得找到自己比较满意的实习工作。


Creative Commons License
This work is licensed under a CC A-S 4.0 International License.