激动难以入眠-记录一个非科班算法四战头条面试之路

本人本科信管金融双学位,研究生理学专业。算法全凭研究生阶段自学。有M厂一年实习经历。
从研究生入学到现在,四战头条,前三次均以失败告终,第四次幸运的拿到了offer意向书,这里记录一下我的四次面试经历。希望对你有所帮助。

第一次(2017.05)- 爬虫实习生

那时自己刚在一家私募公司写了两个月爬虫,但从未经历过大厂的面试,满怀信心却被现实浇了一盆冷水。那时的我,甚至连栈都不会用。
面经如下:
1、tfidf的原理是什么,请写出计算公式
2、去除字符串中连续的ac 和 b,比如aaccd,去除之后就是d,因为去除中间的ac后,剩下acd,则再去除ac,剩下d。
这道题当时完全没有考虑到用栈来解决,写了一个递归的很麻烦的办法,结果可想而知啦。
用栈很好解决啦,遇到一个c,判断栈顶是不是a,如果是a,则栈顶元素出栈,如果遇到b,则不做任何操作,如果遇到其他情况,将元素压入栈顶。
3、将一个字符串变为数字,这其实考察的是python内部str转int的知识,可以通过看源码了解内部的实现机理。

第二次(2017.07)- 算法实习生

距离第一次面试隔了两个月,期间在一家游戏公司实习,但感觉就是上了两个月没效率的自习,期间刷了两百道leetcode简单题和中等题。
面试经验:

1、LDA的推导
2、常见的分类算法有哪些?
3、SVM的推导
4、SVM如何选择核函数?

知乎帖子:https://www.zhihu.com/question/21883548

5、LR的推导
6、LR的缺点


这次还没等考数据结构题,几道基础的机器学习问题就把我难倒了。也正因为这次面试,我放弃了已经到手的融360实习offer,在实验室钻研了近一个月的机器学习理论。正是这一个月的学习,我拿到了美团、猫眼、渡鸦的实习机会,并最终选择了美团。



第三次(2018.04)- 算法暑期实习生

此时的我已经在M实习了八个多月了,感觉自己机器学习知识也有了一定的积累,也顺利通过了头条的笔试。这一次,我终于突破了头条的第一轮面试,可最终的结果,还是失败。
面试经验:

一面:
遇到了一个搞图像算法的面试官,跟我的方向不太符合,所以没有问太多问题。总体来说比较轻松
1、CNN的原理简单说一下。
2、SVM的原理。
3、链表实现加法,由于给出的链表已经是按数位逆置的了,所以比较简单。

二面:
考了很多知识,涉及到爬虫,计算机网络,操作系统,手写代码推导,数据结构题,java基础知识,算法原理等等

1、LDA的原理
2、极大似然的原理
3、LR的推导,损失函数,梯度下降过程
4、操作系统的LRU
5、浏览网页的流程,涉及什么链路协议之类的
https://blog.csdn.net/qq_26460507/article/details/78035933
6、Map和HashMap的区别
HashMap:hash+链表+红黑树
红黑树:https://www.jianshu.com/p/0b68b992f688
7、如何对反爬虫机制进行破解
8、手写推导FM,并说出FM和FFM的时间复杂度
7、判断一棵二叉树是不是二叉搜索树
8、将一棵二叉搜索树转换成双向链表(用递归写)
https://blog.csdn.net/zengzhen_csdn/article/details/51198530
9、L1和L2的区别,以及各自的使用场景
10、为什么梯度是函数变化最快的方向
https://zhuanlan.zhihu.com/p/24913912
11、tfidf的原理
12、操作系统中的动态链接和静态链接

13、数据库的一道底层原理题,好像是存储吧,记不清了,反正不知道。


没什么脾气,就算机器学习都推导出来了,但是计算机网络、操作系统早就忘的一干二净。

第四次(2018.08)- 秋招算法应届生

到了真正的秋招,用了同学的白金内推码,直通面试。
面试经验:

一面:
1、介绍项目
2、强化学习PG的推导
3、强化学习DQN,DDQN,AC,DDPG的区别

4、n个[0,n)的数,求每个数的出现次数(不能开辟额外空间)
这里关键是看清楚题意,n个数,然后是左闭右开的区间,也就是说每个数都不会大于等于n,那么思路就来了:如果我们给一个索引下的数不管加上多少个n,那么这个数对n取余的话,我们就能知道这个数原来是多少;另一方面,如果一个数出现一次,我们就在对应索引位置下的数加上n,那么每个数对应索引位置上的数对n取商的话,就是这个数出现的次数。这样就做到了没有开辟额外的空间。代码现场直接略过了。

5、K个有序数组,找一个长度最小的区间,在这个区间里至少包含每个数组各一个数。

分析:初始化带下为K的最小堆,K个数字是每个数组中的最小值,设置变量max记录k个数字中的最大值,删除堆顶元素,将原堆顶元素对应的数组中下一个元素加入到堆中,调整堆,并且记录当前区间范围为(max-min),重复执行直到某个数组所有值都被删除。

二面
1、介绍DQN的项目
2、数组的全排列(空间复杂度O(1))

3、两堆钞票,尽可能均分(利用背包问题的思想)

三面:

1、无向无环图中,最短路径的最大值(O(n^3)的解法)
这里考察的其实就是Floyd算法。哎,只可惜自己当时没有复习图的相关算法,完全不会写呀。

2、LSTM的公式

3、RNN为什么出现梯度消失

4、BPTT的推导。

三面结束,觉得自己这次肯定凉了,我问了面试官,为什么面试的内容跟我应聘的岗位基本没有关系,我面广告,全程都没有广告推荐相关的问题?得到的回答是:统招统分。
面试后的第三天,我问内推人,她那边的状态是已完成,并通过牛客得知这好像是已通过的状态,心中一顿狂喜。可是到了第二周的周五,hr说让我转岗,我同意了转岗,不过简历需要重新评估。本周四,收到了转岗的加面通知(心里凉透了,因为对于转岗的岗位,自己简直一无所知)。

不过人生总是充满惊喜,周五,hr加我微信说不需要面试了,要跟我简单沟通下(心里想这下更没希望了,一定是面试官看我的简历跟转岗岗位毫不相关,直接就拒绝了)。下午接到hr的电话,说一面的面试官对我比较满意,愿意让我做算法的工作,不过秋招的岗位还是转岗的岗位。

我毫不犹豫的接受了,并很快收到了offer意向书。

四战头条,过程虽然苦涩,但结局还算美好。希望我的经历能够对大家伙有所帮助!





#字节跳动##面经##算法工程师##秋招##内推#
全部评论
牛逼牛逼!你为什么这么秀!
点赞 回复 分享
发布于 2018-09-02 00:09
大佬,可以私信问你几个问题吗?
点赞 回复 分享
发布于 2018-09-06 10:28
楼主很强,大佬,而且我真的好羡慕楼主研究生还可以实习一年。。。我们导师实习一个月都被骂死
点赞 回复 分享
发布于 2018-09-01 10:26
楼主你这研究生读的是真爽啊,一直在实习,还能收获学位,人生赢家
点赞 回复 分享
发布于 2018-09-01 10:08
真的好棒!恭喜呀!
点赞 回复 分享
发布于 2018-09-06 10:13
大赞楼主,付出终有回报 沾沾喜气
点赞 回复 分享
发布于 2018-09-05 22:38
这破论坛我谁都不服就服你
点赞 回复 分享
发布于 2018-09-05 11:19
楼主很强
点赞 回复 分享
发布于 2018-09-02 22:58
大佬厉害
点赞 回复 分享
发布于 2018-09-02 21:48
n个[0,n)的数,求每个数的出现次数 这个题的思路要怎么实现啊?感觉还是要开辟空间啊。不然时间复杂度至少要 O(N^2)啊
点赞 回复 分享
发布于 2018-09-02 21:26
感觉算法题略难啊
点赞 回复 分享
发布于 2018-09-01 23:53
生理学?这么厉害吗?
点赞 回复 分享
发布于 2018-09-01 17:01
你这实习一年真的骚。。。
点赞 回复 分享
发布于 2018-09-01 16:18
恭喜!
点赞 回复 分享
发布于 2018-09-01 16:16
楼主几号面试的?
点赞 回复 分享
发布于 2018-09-01 10:21
恭喜恭喜
点赞 回复 分享
发布于 2018-09-01 08:53
恭喜恭喜!蹭蹭喜气!疯狂吸欧气!啊啊啊啊啊大佬的名字!我要疯狂吸
点赞 回复 分享
发布于 2018-09-01 08:51
刚啊
点赞 回复 分享
发布于 2018-09-01 08:46
Dqn的项目?楼主是用强化学习做推荐吗?
点赞 回复 分享
发布于 2018-09-01 08:21
恭喜恭喜
点赞 回复 分享
发布于 2018-09-01 08:17

相关推荐

03-12 20:39
门头沟学院 Java
---#### **一、项目相关**1. **超卖问题解决方案**     - 如何通过乐观锁解决库存超卖?     - 分布式锁(Redis)如何实现一人一单限制?     - 乐观锁失败后的处理机制(直接返回失败?是否有重试?)     - 分布式锁超时场景下的问题(锁提前释放导致并发问题,看门狗机制如何续期?)2. **Redis应用**     - CAP理论在Redis主从模式中的体现(主从异步复制牺牲一致性保证可用性)     - Redis哨兵模式与集群模式的区别?---#### **二、数据库**1. **MySQL事务**     - 事务隔离级别有哪些?默认级别是什么?     - 事务传播机制(如`PROPAGATION_REQUIRED`、`PROPAGATION_REQUIRES_NEW`的区别)  ---#### **三、并发与多线程**1. **线程池**     - 核心参数(核心线程数、最大线程数、队列类型、拒绝策略)     - 工作原理(任务提交流程、非核心线程创建条件)  2. **锁机制**     - 分布式锁(Redisson)与本地锁(synchronized)的适用场景差异     - 乐观锁实现方式(MySQL的CAS操作)  ---#### **四、Java基础**1. **类加载机制**     - 双亲委派模型流程及作用(保护核心类库)     - 如何打破双亲委派(自定义类加载器重写`loadClass`方法)  2. **集合框架**     - HashMap冲突解决(链表转红黑树)  ---#### **五、操作系统**1. **内存管理**     - 页面置换中的“抖动”现象(频繁换页导致性能下降)     - 页面置换算法(LRU、LFU、FIFO)  2. **调度算法**     - 常见作业调度算法(短作业优先、长作业优先、高响应比优先)  ---#### **六、网络**1. **TCP协议**     - TCP报文头字段(源/目的端口、序列号、ACK/SYN/FIN标志位、窗口大小)  ---#### **七、算法与数据结构**1. **堆的应用**     - 优先级队列底层实现(最大堆/最小堆)     - Top K问题解法(维护大小为K的最小堆)  2. **经典算法**     - 快排实现思路(基准选择、分区、递归)     - 最短路径算法(Dijkstra、Floyd)  3. **编程题**     - **硬币找零问题**(动态规划,求最少硬币数)     - **字符串频次统计**(前缀和优化查询效率)  ---#### **八、其他**1. **系统设计**     - CAP理论的实际取舍(Redis主从模式牺牲C保证AP)  ---### **参考答案/关键点**1. **乐观锁与分布式锁**     - 乐观锁通过版本号/CAS实现,失败后直接返回错误;分布式锁需结合超时和续期机制(Redisson看门狗)。  2. **事务传播机制**     - `PROPAGATION_REQUIRED`:加入当前事务;`PROPAGATION_REQUIRES_NEW`:新建独立事务。  3. **双亲委派打破**     - 自定义类加载器重写`loadClass`方法,如Tomcat为隔离Web应用打破委派。  4. **TCP三次握手**     - SYN、SYN-ACK、ACK报文交互,序列号保证可靠传输。
查看25道真题和解析
点赞 评论 收藏
分享
评论
21
211
分享

创作者周榜

更多
牛客网
牛客企业服务