腾讯 MIG / 网易互娱 / 今日头条 从春招到秋招的面经
前言
作为 19 届毕业生,从今年 3 月返校猛然醒悟要开始准备找工作,到现在 9 月中下旬基本结束秋招,目前应该是在腾讯和网易互娱中二选一,这段时间牛客帮助了我很多,所以虽然不擅长写文字,还是想把自己的春招和秋招记录分享一下回馈大家。本人本科不知名 211,硕士走运保送 top2,剑指 offer 50 题刷完了反复看了几遍,leetcode 也没刷上三位数,自我感觉基础还算扎实。工作地点是想往广深走所以可选项不多,方向的话投的也比较杂而不精,横跨算法、iOS 和游戏,毕竟各种因缘际会,只是尽力混口饭吃。
笔试的话还是基本功吧,面经的话多看看还是能抓住一些常见的考点的,也不排除同家公司的新鲜面经能押到题,就算是玄学也是面试前最好的安慰剂。除了一些笔试直接挂的没列出来,每一面的考点我都尽量进行了复盘,没有复盘的也不要再问我选择放弃,请自行 google。我妈常说:认清自己、尽力就好,送给各位秋招中的同学。
春招实习
腾讯 MIG
方向:技术研究-机器学习方向实习生(深圳)
职位:无线研发部-应用研究岗(深圳总部)
一面:3.16 17:00(直接电话面试 20min + 两道笔试题)
- 直接介绍自己的研究项目和工程经验,对于研究项目详细解释了特征工程部分和如何评价(RMSLE),对于工程经验介绍自己学习到了什么;
- 然后笔试题第一道是寻找字符串中的驼峰部分(ABA 形式)并输出不含驼峰部分的字符串:把 ABA 改成 AAA 即改动最小又不造成新的驼峰;
- 第二道是针对多个 query 记录大文件寻找 query 频数 top20,写出思路:哈希记录频数,小顶堆或者归并排序快速寻找 top20,再结合 map-reduce 优化。
二面:3.29 11:30(预约电话面试 20min)
- 再问了一遍研究项目和工程经验;
- 然后问 OC 中 import 和 include 区别:避免重复引用、循环依赖;
- OC 多线程:异步获取数据时使用 GCD 多线程操作;
- App 出现卡顿是什么情况:TableView 在构建 Cell 不恰当(没有重用、动态加载子 View)时消耗大量资源出现卡顿;
- 深浅拷贝:值复制与引用复制。
HR面:3.29 20:50(直接电话面试 15min)毕业未来规划,家庭、恋爱情况,实习时间,大概讲一下简历上的项目,HR 对项目很感兴趣让我通俗一点讲解相关技术,对于概念聊得很好。
Offer:4.8 收到正式确认电话和录用函邮件,北京再见,深圳你好~
腾讯 IEG
方向:技术研究-机器学习方向实习生(深圳)
一二面:3.29 16:00(直接电话面试 20min + 30min)
- 介绍研究项目;
- 线性回归的优化方法:优化平方误差代价函数;
- 讲一下梯度下降的过程:平方误差代价函数对参数求偏导,顺着梯度方向以一定学习速率下降,直到全局最优;
- 线性回归模型如何拟合非线形模型:通过数据挖掘高维特征的线性关系;
- 大量数据如何快速训练:批量并行训练;LR 了解嘛:最基本的二分类模型;
- 讲一下 GBDT 和 RF 的区别:RF 是 bagging 随机抽样特征和样本并行训练决策树然后投票或者加权平均,GBDT 是 boosting 串行针对上一次训练的残差训练决策树然后加权平均;
- 如何在线训练:离线训练好模型然后在线上用(要求在线训练模型:不知道);
- C++ STL map 底层是怎么实现的:hash 存储 key 和对应 value(这个是 unordered_map,map 是用平衡二叉树中的红黑树);
- 对堆的理解:数组存储树的思想,根节点比左右子节点大或者小,堆排序 O(nlogn);
- 对于图里面的最短路径:Dijkstra,维护一个已访问和一个未访问点的集合,每次从未访问集合里找到到已访问集合距离最小的点加入已访问集合,贪心思想从局部最优推到全局最优,时间复杂度 O(n^2);
- 吃鸡里如何检测是否开了透视挂:看视角是否长时间看墙、看从墙后出现和被攻击之间的时间差;
- 王者荣耀如何检测挂机:长时间不动、装备不更新、队友聊天出现"挂机";如果隔一段时间会动一下:看经济和经验随时间的曲线是否正常。
放弃:由于提前批时间即将截止,简历又在 MIG 那边报批中了,沟通说是需要先放弃 MIG 释放简历才能继续 IEG 这边流程,存在风险还是决定求稳去 MIG 了。
阿里信息平台
网址:https://campus.alibaba.com/
方向:算法工程师-机器学习方向实习生(杭州)
一面:4.2 20:00(预约电话面试 30min)
- 介绍研究项目和竞赛,详细问了特征工程和机器学习模型的工程;
- 延伸到模型怎么调参,GBDT 和 RF 的详细内容:RF 是 bagging 随机抽样特征和样本并行训练决策树然后投票或者加权平均,GBDT 是 boosting 串行针对上一次训练的残差训练决策树然后加权平均;
- 决策树的构架过程:解释信息熵和计算公式,选择信息增益最大的特征分裂子树,直到信息增益小于阈值或者子节点内样本数小于阈值;
- 讲一下了解的排序算法:选择排序,冒泡排序,快速排序,堆排序,归并排序;
- 快排为什么叫快排,证明一下时间复杂度:每层时间复杂度 n,递归深度 logn,所以 O(nlogn),严格的数学证明暂时想不起来;
- 操作系统中的进程和线程有什么区别:进程是处理一个完整任务,线程是进程开辟的用于处理同步或者异步的子任务。
备胎:内部评级 B+,安坐备胎池。
阿里信息安全
网址:https://campus.alibaba.com/
方向:算法工程师-机器学习方向实习生(杭州)
一面:4.16 14:00(预约电话面试 30min)
- 介绍了简历上的项目;
- 项目中用了 GBDT 和 RF,RF 效果更好,为什么 bagging 比 boosting 效果更好?
- 线性回归的基本假设?
- 多重共线性(Multicollinearity)对线形回归有什么影响?
- 树类模型的基本假设?(面试官:这些都是套路题应该要准备准备)
- 面试官教学:统计学习中参数估计的三个性质,无偏性、有效性、一致性;
- 计算文本相似度时用的什么方法:两个文本向量的余弦值;
- 余弦值和皮尔森系数有什么异同?
- 如何对中文分词:基于已有词典的前向\后向最大匹配,对于未出现过的词用 HMM 分词;
- 详细说一下 HMM 分词过程?
- SVD 过程?
- SVD 和 PCA 异同:都是降维方法...
已回绝:全面碾压,碾到成渣。统计学还是要好好学,毕竟传统机器学习就是统计学习,对于各种机器学习模型除了关注其算法细节,还要关注其基本假设即适用的问题和数据范围,才能在调参用库的工作中脱颖而出。
今日头条
方向:iOS 开发实习生(深圳)
职位:今日头条主端 iOS 开发实习生(北京总部)
一面:3.31 14:00~18:00 现场连续三面(每面均 40min 左右)
- Cocoapods 常用命令:install、uninstall、update;
- Https,客户端与服务端的加密通信过程:说了三次挥手没 get 到面试官的点;
- 手撕代码,只由 2,3,5 作为因子的定义为丑数,求第 n 个丑数:套路题,维护三个指针分别 x2,x3,x5 往前推进;
- OC 中 strong 类似的关键字讲一下:strong 强引用,weak 弱引用,assign 基本类型;
- 设计模式中状态模式和策略模式的区别:不记得了(本科也许学过吧 = =);
- 手撕代码,二维数组,由 0 和 1 构成,0 可走 1 不可走,每个位置只能往右往下走,求从左上到右下的所有走法:动态规划。
二面:
- 讲项目,项目中提到的 protocols 和 delegate:delegate 是设计模式中的委托模式,是一种思想,protocols 协议是 OC 中实现这一思想的具体机制,当然我们也习惯把实现 protocols 接口的实例命名为 delegate,再拿 tableView 举例;
- 客户端和后端如何传输数据:讲网络七层模型,三次握手建立连接,get post 的区别;
- struct、class 有啥区别:都能在内部定义数据和函数,class 可以继承;
- Cocoapods 管理,静态库和动态库是什么:不知道;
- iOS 为什么只能在主线程中刷新 UI:UI 优先级最高要及时刷新避免反应卡顿,多线程异步刷新 UI 很耗费资源而且可能出现同步错误;
- 熟悉什么排序算法:冒泡排序,快速排序,堆排序,归并排序;
- 手撕代码:二分归并排序(递归一通乱写);
- 怎么学习的 iOS,有没有遇到或者解决的有趣的问题:自由发挥。
三面:
- 讲项目,项目中提到的 drawRect,讲在底层画布上绘制,讲这个函数很耗费资源,顺带讲了一些 UIView Animation;
- 手撕代码,蛇形层次遍历二叉树:套路题,维护两个 stack 一个从左到右一个从右到左;
- 又聊到满二叉树,n 层一共有 (2^n)-1 个节点,第 n 层有 2^(n-1) 个节点;
- 又问一遍:网络传输,七层结构,TCP/UDP,三次握手四次挥手;
- 慢启动、拥塞控制:不知道;
- 多线程,GCD,dispatch_sync/async 区别:dispatch_sync 的任务在被分配的 queue 中是同步堵塞的,dispatch_async 的任务在被分配的 queue 中是异步的;
- 又补充了一下项目中的 protocols 和 delegate。
HR面:4.25 18:00(直接电话)了解基本情况和手头的其他 offer,因为之前投的深圳岗问调整到北京可以嘛?说了下实习地点薪资,口头确认面试通过。
Offer:4.27 收到正式确认电话和录用函邮件,400/天真是诱人,但是我选择腾讯~
网易互娱游戏
网址:http://gzgame.campus.163.com/
方向:数据挖掘机器学习算法工程师(广州)
一面:4.16 14:45(预约视频面试 30min)
- 海量数据寻找重复最多的:Hash 存储重复次数,然后找最大,结合 map-reduce 优化;
- 一个只存有整型数字的文件排序,文件从 1MB 到 1PB 的情况:小文件直接排序,大文件使用 map-reduce 归并排序,只含有整型的话可以考虑 bitmask(但是好像只能存下存在并不能排序?);
- 逻辑题,一个监狱有三个犯人,一碗汤如何让他们公平分配(没有其他工具):只要感觉公平就行?(原则是谁分谁后拿:甲分汤,乙挑两碗出来,甲拿最后一碗,然后乙丙退化到两人分汤问题);
- 逻辑题,27个一样的小球其中有一个轻的,一杆秤最少要称几次才能找出来:3次,每次三分称其中两份就能确定轻球在哪堆里;
- 逻辑题,12个一样的小球其中有一个有问题(轻或重),一杆秤最少称几次找出来:4次;
- 讲项目,问数据集怎么收集的,数据预处理怎么做的,为什么线性回归效果差:需要特征归一化,很难拟合复杂关系;
- 用到了 GBDT 和 RF,讲一讲区别:第几遍讲这个我都不记得了 = =。
下面没了。
秋招正式
腾讯 MIG
职位:测试开发(深圳总部,部门偏 AI 评测,应用研究岗不够用了调剂到测试开发)
考核转正:部门也没有特别考核,主要还是 leader 看平时表现,结合部门 HC 情况。9.12 收到录用意向书,正式 Offer 和薪资要到九月底到十月初再谈。
字节跳动
方向:算法(深圳)
一面:8.12 10:30(春招 offer 直通面试,只有一轮,预约视频面试 30min)
- 吹一吹在腾讯做的实习项目:视频理解与视频搜索 demo;
- 给一个以字符串表示的 n 位数,删掉 k 个使剩下的最大:位置 0 到 k+1 找 max 作为最高位,假设 max 位置为 i,删掉 max 前面的 i 个,递归问题为位置 i+1 到 n 的字符串删掉 k-i 个使剩下的最大。
加面:8.16 16:00(怀疑是 iOS 转算法所以加面,预约视频面试 30min)
- 应用商店如何处理用户搜索:搜索文本和游戏名称、标签匹配,协同过滤推荐;
- 基于用户的协同过滤如果用户有一亿,搜索相似用户很慢:先对进行聚类,再在类内部计算相似;
- xgboost 如何分裂:决策树分裂子节点,找到信息增益最大的分裂点;
- 最近看过什么开源源码嘛:没有;
- 推导 LR:写出了最大似然和代价函数,没推导出梯度函数(真要现场手写求导还是怂了);
- 写一个类似于 LRU 的算法,用 C++ 写的,还考察了代码细节(手写还要扣 API 细节那是真滴难受)。
已挂:硬实力还是差点火候,加面表现不好,加挂了是真难受。
网易互娱游戏
网址:http://gzgame.campus.163.com/
方向:游戏研发(广州)
职位:游戏研发工程师(广州)
一面:8.16 11:00(预约电话面试 40min)
- 吹一吹在腾讯做的实习项目:视频理解与视频搜索 demo;
- 哈希表的实现原理,冲突时候的搜索时间复杂度:没太懂时间复杂度是要考察什么;
- 单向链表删除倒数第 k 个节点:多个指针遍历并维护位置;
- 多进程和多线程的优劣,多线程会有神恶魔问题:线程是进程里面的多任务,可以共享资源,但是会出现资源争抢;
- TCP/UDP 优劣,三次握手过程,TCP 如何保证稳定性:通过建立连接并保证数据完整性,必要时重发数据;
- 进程空间里的结构和机制:函数和局部变量在栈里,静态变量,申请的空间在堆里要自己释放;
- DNS 过程:一层层往上级 DNS 服务器请求,获得域名解析的 IP 地址;
- Python 装饰器,lambda:装饰器没用过,lambda 是闭包,我的理解就是匿名函数;
- Python 多线程会有什么问题:没用过 Python 多线程底层;
- C++ 虚函数,多态:虚函数是一种接口,通过子类继承父类并实现接口来实现多态;
- C++ 依赖库,依赖库还有依赖,如何进行编译:拓扑排序算法。
现场面:9.15 10:00(做题半小时,面试 40min)
- 笔试题要保密,题目比较基础,而且做完之后面试官也没有问 = =;
- 问了问项目,大概介绍了,也没扣细节;
- Python 的内存泄漏与分析:Python 内存管理机制;
- 给一个玩家列表 vector<int>,删除其中值为 0 的不活跃玩家:从后往前遍历,将值为 0 的玩家交换到最后一个位置 pop_back()(这个是之前面经看到的"标准答案",可能作为有序列表在末尾 pop_back() 要比在中间 erase() 更有效?);
- 吃鸡游戏中,有 100 个玩家(包括其中心坐标等信息),每个玩家的头、身、躯干等等分成多个模块,某个玩家向一个方向射出激光,给定 API 判定激光和某个模块是否碰撞,问如何快速判断被射中的玩家和其身体模块:通过计算其他玩家中心坐标和激光原点的方向与激光方向的夹角缩小可能被激光击中的范围内的可疑玩家范围,再用 API 遍历其身体模块判定被击中玩家和其身体模块(还需要考虑激光是否可以穿透等情况);
- int main() { int a[100000000]; vector<int> b; },问在内存中是什么情况:区分堆栈,另外申请空间很大栈是否会溢出,要在放在堆上要手动 malloc 申请内存再释放;
- 聊了聊有玩什么游戏:Switch 上塞尔达 150h 而且 120 全神庙通关;塞尔达有什么出色的地方:解谜神庙设计,物理引擎...;
Offer:9.17 通知,9.18 现场拿 Offer,互娱貌似没有议价空间,只是在带有薪资信息的 Offer 上签字算是两方。
FreeWheel
方向:数据挖掘/研发
现场笔试:8.31 下午(1.5h,非常全栈)
- 完全二叉树
- 手写 SQL(排序,范围)
- 网络七层结构
- HTTP 1.0 与 1.1 区别
- 按照规则重构树结构算法题
- ......
就是陪同学去看看外企,估计笔试挂了。