一个算法菜鸡的面试经验总结

给找工作的同学一些建议

Posted by Huper on May 9, 2019

今年春招差不多也到尾声了,四月份开始到现在本菜鸡也趁着春招的热度找了波实习,感触和收获还是非常多的,现在总结一下,希望能给以后找工作的小伙伴们一些建议,干货还是非常多的。我会从面试前准备,简历书写,以及面试期间如何表现几个方面说一下。

首先说下我的个人情况,研一,没有论文,没有好的项目(简历上一些项目都是非常水的大作业,基本没有什么自己的东西)。个人感觉我这个配置,找算法岗的实习还是相当(非常非常)尴尬的,简单来说就是没有东西。公司招实习生是非常讲究效益的,如果你在实习期间没有给公司带来什么实际效益,然后实习完就拍拍屁股走人,那公司为什么要招你?再加上现在春招这个点,很多大厂主要都是优先考虑应届生或者下一届的实习生,研一就出来实习就比较尴尬。如果有很多同学现在的状态跟我一样也想找算法岗的实习,那你就可以看一看。当然,那些研一就顶会和竞赛奖满天飞的同学可以直接走了

然后我大体说下对于今年算法岗的看法—爆岗 ,就是投的人真的太多了,从四月初左右到现在一个月的时间,我前前后后投了有30多封简历,有段时间看到bbs上有招聘信息就会直接发简历,有些职位还是相当匹配的,但是最后约我面试的只有五家。我个人觉得如果投简历的人如果不是很多的话至少会给个面试的。然后面了一些公司以后,我觉得:论文和好的项目对申请算法岗真的很重要,这样在面试的时候,全程跟面试官讲你的论文就行了,如果你没有这些东西的话,那面试官只会用很多基础的知识和coding去卡你,所以如果你能在学校产出比较好的论文的话我建议还是不要实习。

#去那里找招聘信息

这里找实习的渠道指的是那种找长期实习或者散招的同学,如果是正规的暑期实习或者全职的话就直接在官网上的校招通道投递简历就好了,应该比散招容易一点。这里我推荐几个比较好的招聘信息发布平台:

1.水木清华bbs实习版

2.未名bbs实习版

3.北航和北邮bbs实习版

2.应届生求职网

还有几个要拉黑的平台

1.boss直聘

2.实习僧

具体原因我就不说了,反正大家最好去推荐的那几个地方。还有一个问题就是,bbs上的实习信息大部分都是那个组的同学发的,他们只是帮你内推,至于内推以后HR能不能看到你的简历就另当别论了。还有就是,投简历的时候一定不要光发个附件过去就行了,即使招聘信息里没有投递格式。邮件标题最好是:学校+姓名+实习月数+每周实习几天这种,然后正文里稍微介绍一下自己。

#面试前准备

我的面试准备主要是从四个方面进行的:机器学习和深度学习的基础算法coding计算机相关基础知识熟悉以前的一些项目

基础算法:这块以前上课的时候我都有做详细的笔记,所以基本就是把笔记重新整理了一下。我把常用的模型公式都自己重新推导了一下,机器学习这块比较重点的模型我觉得有LRSVM图模型 ,PCA和SVDAdaboostGBDT和XGboost 等等,最好都能重推一下公式,至少要对他们的大体流程比较熟悉。然后深度学习这块就是CNNRNNLSTM等基础结构和原理,BPBPTT的原理,其他的比如各种优化方法,各种激活函数的优缺点等等。下图就是我自己的总结,大概一周内完成:

coding:刷题就行了,一定要白板刷题,不用IDE培养自己写bug free的code(很重要)。同时一定要掌握常用的算法和数据结构并能准确的分析算法的时空复杂度。就算刷题了,面试的时候也有很大可能被问到一个你从来没见过的问题,这时候不要一个人埋头苦想,一定要多和面试官交流,获得点提示什么的,先弄出来个复杂度爆炸的算法也没关系,可以慢慢优化。

计算机相关基础知识:操作系统,网络,数据结构里常考的那些问题一定要懂。然后一定要加入一些自己的思考和总结。比较常问的也就是这三个了。

#简历书写

要点:废话不要多说,面试官最关注的是你的项目经历和你的技能,所以想办法在这两点上打磨就行了,同时注意,写项目的时候一定要写明自己在项目中承担了那些工作,我投爱奇艺的时候第一次就只写了自己的项目名称根本没人理,后来完善了一下项目信息后再投就回我了。

#面试期间如何表现

这部分应该是比较重要的了。我拿我个人经历详细说一下吧,最后约我面试的一共有五家:阿里(盒马生鲜nlp),爱奇艺(知识图谱和大数据),微软小冰,香侬科技(一家nlp初创公司)和头条。阿里那边告诉我工作地点是在杭州,并不想去,所以没参加面试。

#爱奇艺

第一轮面试前面就是让我介绍一下自己的项目,然后问了下RNN和LSTM相关的东西,这些东西就根据自己的准备回答就行了,不知道也不要紧,直接说不会就行了,尤其是介绍自己项目的时候,不会的东西或者只是了解一点点的东西最好不要说。

后面是手撕代码,三道算法题:

1.栈实现队列和队列实现栈。(签到题)

2.给定一个数组,要求原地修改数组,使得修改后的数组前面小于0,中间等于0,后面大与0。(类似快排中的二路重排问题,这里换成三路重排,时间O(n),空间O(1))

由于基本都做过,所以我五分钟左右就写完代码了,这里一定要注意大家手撕代码的时候一定不要盲目追求速度,最重要的是bug free,一些低级错误千万不要犯。

然后面试官给了我一个思考题:4G的shrot类型数据如何进行排序?就是一个外部排序的问题(当时讲数据结构的时候,老师好像把这部分跳了。),我瞬间想到的答案就是划分小文件然后排序组合。因为int类型的范围是-2^15 ~ 2^15 - 1, 我们可以把这个范围划分成很多桶(在这里指小文件),然后把这些数哈希到指定的桶中,这样第二个桶中的数据都是比第一个桶中的数据大的,然后我们对每个桶中的文件进行排序,最后把所有的桶组合起来就是最终的全局排序结果。

面试官随后提到了这种方法比较依赖于数据分布,可能某个桶中的数据会远远多于其他桶,问我有什么更好的方法?然后正当我想归并的时候,面试官告诉我:行,不用说了,这边时间也差不多了,感觉你思路还不错,可以下一面了。

第二面是他们组的leader,由于我简历上写我用过spark,他就问了我很多spark相关的东西,我就按照自己知道的说了一下。然后又问了下我CRF相关的知识,我根据图模型那一套回答了一下。最后的coding竟然是大水题two sum?

二面完了以后让我回去等结果,然后下周一收到反馈说他们组业务方向有变动,现在不做nlp了,实习生计划暂定,问要不要推荐我去另一个做数据和知识图谱的组。我:不想!

#微软小冰

小冰组我投了两次,有个组居然回我了。学长说小冰那边挺重视项目经理的,而我简历上并没有出众的项目。小冰的面试我感觉是最难的,三面大概持续了三个多小时,全是技术面。

一面:

上来让我介绍自己。我:全民制作人大家好,我是练习时长。。。(开个玩笑)。面试官非常儒雅随和,我也完全没什么压力,让我介绍了一下在之前实习公司做的东西,然后问了下RNN的反向传播推导,画了个LSTM的图,介绍一个自己最有成就感的项目(实际上并没有),讲了下隐马尔可夫模型。

然后是coding:

1.在多叉树中找到两个节点的最近公共祖先。(二叉树最近公共祖先的变种,直接在深度优先遍历的过程中顺便匹配节点就行了,复杂度不高的,这道很快就写完了)

2.最长公共子序列问题和最长公共子串问题。(子序列是打卡题,很快就写完了,子串的话受到子序列的误导想了有一会儿,最后的状态转移公式实际很简单)

写完之后面试官顺便问了下子序列问题中O(mn)的空间复杂度能不能进一步优化,空间优化是动态规划里常考的一类问题,这里就是开两个数组迭代更新。

一面进行的很顺利,面试官真的很棒。

二面:

这轮明显是压力面了,面试官从头到尾都给我一种我不想招你的感觉。上来还是介绍自己一个项目,我选的是一个实时网页分类系统,我还特别强调说这个系统是单机的,当时没有部署到分布式环境下。然后他就让我给他设计一个分布式的爬虫系统。我:。。。。

最后我给的设计就是很简单的master-slave架构,然后详细讲了一下爬取信息维护这种,说了下bloom filter判重等等,他貌似很不想听的样子。后面又问了CRF,随机森林,TF-IDF这些,都是我项目中用到的,中间我将的时候不停打断我(我就真的很不爽了),吓得我很多东西都不敢说了。

然后还是coding:

1.O(1)空间和O(n)时间内判断一个int是不是回文数,还特别强调让我不能使用O(n)的空间,我就想怼他:输入是int,这个题怎么可能用到O(n)的空间?但是当时怂了,这个题实际很简单,核心就是反转这个整数,但是我一开始居然写复杂了,后来擦了重写的,他似乎很不满意。

2.螺旋输出矩阵,这个题做过很多遍了,思路比较简单,但是边界情况比较恶心。这个题写完后,面试官还是试图对我说我有个情况没考虑到,然后我跟他解释了一下以后他就走了,然我等下一面。

三面:

先让我介绍我一个命名实体识别的项目,我从头到尾讲了一下以后他就问我:效果怎么样?我说非常差,然后大家都笑了。后面还问了一些命名实体识别常用的评估方法和原理等等。

coding是数独问题,这个题我印象是当时算法上机考试老师临时加的一道题。然后就神搜加回溯写了一个版本。后来面试官说不对,因为我判定合法的时候只考虑的当前行和当前列不重复(我一直以为数独是这么玩的),后面面试官告诉我每个3X3的小格也不能重复。然后这个判重我当时脑子有点懵也写得磕磕绊绊,后来在面试官的提示下还是写出来了。

然后两天后,收到拒信:项目和实习经历匹配度不高。

#香侬科技

同学内推的一家nlp初创公司,李纪为大佬创办的 。感觉还不错,就是有点累。面试难度并不大。

一面:

推导下HMM,介绍下项目,问了下常用的激活函数和优缺点,然后稍微聊了会天。

coding:

1.层次遍历二叉树(打卡题)

2.拓扑排序输出节点

拓扑排序我是用深搜写的,写完后面试官问能不能用广搜写,我说:可以,但是不想写了,然后大致讲了下思路。我写题用的c++,面试官就问我对python熟不熟,我趁机狠狠地吐槽了一番python。

后面还是愉快地聊天。

二面(两天后):

讲下wordvec,LSTM和CRF,wordvec那边我就讲了下CBOW和Glove然后讲了下层次化softmax和负采样的原理和作用。LSTM问了它和resnet的相似性。CRF问了下和HMM的区别以及HMM能不能用到我项目的模型了。

coding:

1.最长不含重复字母的子串(滑动窗口,O(n))

2.O(n^2)和O(nlgn)实现最长递增子序列

两道都做过,所以后面就是愉快聊天了。

第二天,给了offer。

#头条

其实之前最想去的就是头条,因为比较近,而且福利也好。但是投了很多简历都不回我,这个AML的部门也是内推了两次才回我的,本来面试都不打算去了,因为香侬这边已经签了,后来那边的人说可以面了以后再考虑一下,本着刷面攒经验的思想,我就面了一下。三面+HR面从早上10.30到下午3.30,期间还在那边食堂吃了午饭。

一面:

大概是我见过最好的面试官了,上来先跟我很详细地介绍了他们的业务,然后人非常非常好。主要还是介绍项目,问了下我想做什么东西。然后问了很多基础知识,我感觉不是很重要了。

coding只有一道:

有m个同学,每个同学面前有一个袋子,里面n个黑球,另外还有无限个白球,然后每次从袋子中抽一个球,如果是黑球就换成白球放进去,如果是白球就直接放进去。问第k次取球的时候所有同学中抽到白球的概率。

直接模拟就好了:开了个m*n的数组模拟k-1轮,最后一轮模拟的时候记录下结果。但是这样空间复杂度太高了,后续在面试官的引导下分别想出了O(n)和O(1)空间的写法,不过整体思路都是概率模拟啦。

二面:

这个小哥明显是偏工程的,所以问了我很多工程上的问题。比如一个解析json的问题,还有操作系统的知识,还问了很多很多网络的知识。后面问了下堆排序的实现方式以及各种操作的复杂度,都是很基础的东西。

coding:

O(n)时间内求一个数的下一个排列数,比如1234 — 1243,这题做过,两三分钟就搞定了。

三面:

其他问题都还好,也是比较偏工程的问题。有一个问题是:如果让我设计一个tensorflow框架,要怎么设计,我简直乱答的。后面也问了wordvec,LSTM和推荐系统相关的知识。问我会用什么语言,我说python,c++,java,然后让我讲了一下这三个语言的内存模型以及java的垃圾回收。

coding:

求一个数组中和为k的长度最小的子数组,我写了两种方法,前缀和的O(n^2)和滑动窗口的O(n)

HR面:

基本就是聊天,然后问问能保证多久实习等等。问我实验室那边能不能协调开,以后要不要留下来等等,我还吐槽了下他们筛简历流程太慢。不过真的很遗憾,头条早点约面试就好了。

头条面完后跟在头条工作的同学碰了个面转了转就回来了,这段时间为了找实习真的是累哭了,不过也算是体会到了算法岗竞争的残酷,攒了一些面试经验。希望可以帮助到有需要的同学。