算法类的三大主要方向:CV、NLP和推荐系统,这三个方向的确是挺热门的,而且大部分公司都有这三个方面的岗位,如果自己的研究内容比较明确,推荐找属于自己研究方向的岗位,例如我是做轨迹数据的,那么找地图业务或者滴滴这类公司,这样更加有优势。如果没有比较明确方向的同学,建议打好算法基础的理论知识。
我自己没有任何实习经历,直接参与的秋招,但是做过两个项目。不过还是推荐去暑期实习,因为实习留用的机会比较大,尤其现在仍然是技术人比较抢手。越早准备越好,因为算法的考察的内容非常多!
一、校招流程
1.互联网公司校招流程
一般招聘过程是“网上笔试——专业面试——hr面试”,网上笔试一般就一次,专业面试有多次,越大的公司专业面试次数越多,阿里头条腾讯一般都是3次,hr面试有1轮也有2轮。
互联网公司网上笔试都是编程题,一般3-5道大题。专业面试比较复杂,时间也比较久,一般面试时间会在1个小时左右,起初会聊一些项目内容,主要考察算法内容的基本功,最后至少有半个小时面试官会出一题编程题,一般就是leetcode上简单题和中等题的难度,如果编程题没写好,前面面试再好也没有用,所以编程的基本功十分重要。hr面试就是聊家常,不过有的公司hr会继续刷人,所以在hr面试过程也不要掉以轻心。
2.金融公司校招流程
一般互联网公司校招开始比较早,所以如果在互联网校招结束后,也可以参加金融公司(银行、基金、券商等)的校招。(这里我只参加过银行的校招,基金和券商后来不想去,就没去,如果有人有这方面的经验可以补充一下。)银行的网上笔试有行测题,有的银行也会加入编程题,有的也会有算法的选择题。银行笔试过了,就会通知面试,一般面试就一轮,不会考编程题,就是出一些题目聊算法内容。结束后,有些人会接到体检的通知,但是接到体检通知不代表公司最终会录用,这就是感觉银行校招最坑的地方。
有明确目标想去金融业,也可以尝试投几个互联网公司作为面试锻炼的机会。
二、刷题
纸质书推荐《剑指offer》,里面讲解会比较详细,有条件可以先看《剑指offer》,再用各类刷题网站,《剑指offer》上是用c++语言编写,如果比较擅长Java或者python,可以自己重新编写,我把我之前用Java编写的源码放在Github上,有需要可以自取。最好还是自己能够重新把书上面的题目自己编一次,然后存档,可以在面试前多看看之前编写的代码。
刷题网站只推荐leetcode和牛客网,大部分互联网公司的网上笔试都会选择使用牛客网的平台,所以这两个网站都尽量要熟悉,leetcode上题目比较多,内容较全。牛客网上有各大互联网公司历史的笔试题目。我自己在leetcode上刷题思路是从前往后刷,简单题和中等题争取自己独立完成,困难题如果自己能独立完成最好,但是不能独立完成也看看讲解。题目我都是看10分钟,如果没有完整的思路,我就直接看答案。有的人觉得刷的越多越好,如果有时间当然是越多越好,有一次我头条面试面试官出了leetcode上第900多号的题目,我是没刷到,当时我怎么改都有一些瑕疵,我自己解题思路上有问题。但是我觉得最重要的是刷一题尽量能够吸收一题,讨论区也有一些人总结这类题的规律,可以多看看。
网上笔试的题目类型,如果看过牛客网上各大互联网公司的笔试题就会很清楚,一般都是应用类型的题目,这类题目都比较复杂,不过大多数应用题背后都有一个核心的解题点,比如图论的深度(广度)搜索等。题目都会要求运算时间和内存,一般内存空间的约束条件都会满足,所以需要在时间上多下功夫,一般刷题的时候,要非常注意解题的时间复杂度,时间越快越好。
一般建议在校招或者暑期实习招聘期间每天都要刷几题,保持手感和思路上的活跃性。如果是找暑期实习,建议放寒假在家就开始慢慢开始刷。如果是为了秋招准备,建议5月份左右也可以开始刷题了。
三、专业面试
专业面试是最重要的环节,也是不可控因素最多的环节。任凭你多么强,如果面试官不喜欢,也无用,所以除了学会卖自己外,也要密切关注面试官的举止。感觉面试官对某个内容感兴趣,可以多讲一些。
1.学会卖自己
如果自己已经掌握了比较丰富的理论知识,就要学会卖自己。在与面试官交流的过程中,除了要展示自己的专业素养外,要学会往自己擅长的领域引导。如果自己有项目经历,往自己项目上引导面试官,因为自己的项目自己最熟悉,聊项目的过程中,尽量说一些细节性的内容,比如我是做轨迹数据的,那么介绍项目的时候要介绍一下如何解决GPS定位漂移的问题。这些细节才能反映我们在这个项目中的思考和参与程度。如果没有项目,面试官一般会选择某些算法来细问,比如LSTM有几个门等这类算法细节问题。
2.编程
面试官出的编程题一般不太规范,所以在写代码之前一定要问清楚题目的一些问题,《剑指offer》上有提供一些题目的注意事项。比较重要的编程题,可以参考leetcode在知乎上的回答。我自己的感觉,链表的内容比较喜欢在面试中考察,树和图论在面试不喜欢考,但是在笔试中喜欢考,因为这部分内容比较复杂,编程花费时间较长。
3.其他
除了聊项目和编程外,有的面试官会根据他们的业务情况想你提问一些业务上的问题,这时候就是非常展现个人能力的时候。尽量把自己的想法说出来就好了,说的越多越好,这个过程不单单是面试官面试的形式了,可以说是业务上的探讨,你也可以提出自己的一些问题。
因为我是做轨迹数据的,面试官曾经问过我以下业务问题:
如果有一幢居民楼的所有居民的轨迹数据(轨迹数据包含定位的经纬度和记录时间),如何能够计算出这幢居民楼的高度。
给一个人一天的轨迹数据,寻找他的OD对(行程的起点和终点)
给一个人一天的轨迹数据,判断他乘坐的是哪种交通工具
......(剩下想不起来了)
四、HR面试
有些人会认为到了hr面试环节就稳了,其实并没有。我曾经被hr面试挂过,后来找了另一个hr把我捞了起来,所以对于hr面试环节也不可以掉以轻心。
我认为hr面试环节最主要是考察我们会不会长期留任,如果是其他地方的岗位,也会询问我们去外地上班的意愿度。
关于薪水方面,据我了解,腾讯和华为都是有严格按照岗位和毕业学校的等级给出固定薪资水平,所以这方面对于应届毕业生出入不大,但是也需要了解自己应聘岗位的平均薪水大概在什么区间范围内。
总结
面试过程尽量展现自己做的事情和能力,把自己的想法说出来就行了。我一般努力将面试当作一次交流的机会,也会向面试官请教各类的问题。
现在大多数互联网公司还是比较喜欢深度学习的内容,金融业喜欢传统机器学习的内容,所以在面试之前也可以有针对性地复习相关的理论知识。面试之前也可以把leetcode上之前刷的题目重新看看,加深印象。
每次面试后都把面试官的问题总结一下,看哪些问题自己回答的不好,那么要学会及时查缺补漏。其实无论是牛客网还是知乎上都有许多面经,这方面的内容可以多看看,一方面看看面试官问的题目,另一方面总结一下面试者的面试经验。
最后希望大家打好编程的基本功和算法的理论知识,找工作一切顺利!
附录
常见算法类的面试题
各类树模型的内容,包括bagging、boosting的区别,RF的步骤,GDBT、XGBoost、LightGBM这三个算法的区别,尤其是XGBoost是目前业界广泛使用的传统机器学习的方法。
Logistic Regression、SVM损失函数形式和推导过程
如何防止过拟合和欠拟合
CNN中卷积原理,11卷积核的作用,各种激活函数的优缺点,L1、L2正则化如何防止过拟合
LSTM(GRU)有几个门,每个门的作用
这里只是总结我遇到的比较重要的内容,不要仅仅只有6题,但是每题包含的知识点非常多。除此之外,可以多看看牛客网上和知乎上的面经,牛客网上的内容比较丰富。
校招信息获取的渠道
非常推荐牛客网的讨论区,不仅有很多公司的内推码,还会有各种部门直推,部门直推一般就不需要网上笔试,直接面试了。
找工作的各种群。
各大公司招聘官网。