北邮人论坛面经转载(2)感谢学长学姐们

找实习两个月
------------

三月初开始找实习到现在两个满月,投了54家公司,去了21场面试,拿了10个offer。下面会是一个长篇的面经,和一些总结的经验教训。



面经
----

### 恒润科技 offer (CE嵌入式软件部)
初期投的小公司(话说千人级别也不能说人小公司,只是名气不足),就在北航那边,一面二十分钟聊聊项目就完,二面也很随意。


### 格灵深瞳 offer (平台开发)
一面:

1. 介绍你知道的传输层协议
2. unix socket和socket了解吗
3. HTTP和HTTPS了解吗
4. 数据库触发器

聊项目。算法题直接被问跪,特别情境化的题,1.人脸图像聚合 2.道路监控视频帧提取和运动重建,没见过这阵仗题意理解严重不足,磕磕绊绊聊完。

二面:
面试官说本来想问我图像处理领域的东西,没想到我图像处理都没入门,不到十分钟就无话可问结束了。


### 携程 一面挂

投完发现工作地在上海,电面7分钟结束,后来查状态就是“一面淘汰”了。

1. 快速排序是稳定的还是非稳定的?时间复杂度呢?什么时候最坏复杂度?
2. 贪心的计算思想是什么?
3. TCP需要三次握手,两次行不行?为什么?

现在回头听录音发现题答得有瑕疵,声音也严重不自信。

### 小米 两面挂 (机器视觉)
论坛散招,约面试的电话里就直接告诉我说你算法很一般,小郁闷。两面一下午完成。

一面:

1. 写个二叉树的中序遍历,递归几行写出来。然后说写个非递归的版本吧,我竟然卡住了...住了...了...最后请求提示才勉强写出来,代码也很丑。
2. 求一个数组的最大子数组和,leetcode原题,先说了个O(n^2)的,然后努力回想dp的解法,写是写出来了;引申到二维就不会了,瞎说了个解法,想了想又说不可行,他也没继续问。
3. Python将一个数组unique有哪些方法
4. C++ vector的内存管理
5. C++11的auto知道吗?使用时应该注意什么

二面:

1. 给一个二叉树,用层次的方式输出它的结构(不是层序遍历,而是类似画图的方式利用位置显示结构)
2. 找到一棵二叉树中距离最远的两个节点(距离定义为边长),聊完思路刚要写他说这个写起来太麻烦了要不换一个吧
3. 换成背包问题,我说这个正好不会,他说哦那没关系我们再换一个
4. 堆排序,说你就写个维护堆的操作就行

### MSRA 一面挂 (IEG - 创新工程组)
在知乎上找到一个北航的学长内推的,几天后就约了电面。

1. 给两个有序链表,去求它们合并起来的有序链表。naive的我就写了个merge,写前面试官提示我不清楚的设定可以问他我也懵懂无知。写完高潮就来了,问你考虑链表有环的情况了吗?相交呢?我...
2. 乱序数组求第k大的数。先说了用排序和用小根堆的做法。又在提示下说了快排里partition的做法,代码写得漏洞百出。
感觉微软很重视测试用例,面试时数次问“那么你有没有设计测试用例呢?”,自己平时真没这个习惯。一面挂得不冤;特别后来参加微软的笔试被虐成狗,才意识到自己当初想着能进微软的念头是多么天真。

### 腾讯(内推) 一面挂
21号下午连着接到腾讯和阿里的电面,筋疲力竭。
面试官南方口音听得很费劲,还经常get不到他的点;问的全是基础知识:

1. TIME_WAIT状态什么情况下会产生
2. 浏览器里敲一个URL,访问了一个网址,然后它整个的过程大概是什么样的(DNS、ARP、路由...)
3. 一个IP包大概是多大呢,有限制没有(真的忘了,也没仔细想就蒙了一个说1500字节?后来想想当时如果能从IP Header 16位的size字段推论也该知道是65535)
4. 什么情况下会考虑UDP、什么情况下会考虑TCP
5. 如果要进行可靠的传输,又想要用UDP,你觉得可行吗
6. HTTP请求在服务器应答、数据传完之后会怎么样一个操作呢?(蒙了,不知道服务器是主动close还是被动close了,当时TCP的状态转移也记不清楚;跟他扯长连接短连接,最终还是没答到他想要的点)
7. select和epoll的区别
8. hash表和二叉树的搜索时间差别
9. 操作系统内存管理
10. 如果申请一个动态内存它是放在堆里面还是栈里面
11. 虚拟内存和物理内存是怎样一个关系
12. 用C语言的malloc去申请内存,它这个时候会立即去分配物理内存吗?(什么鬼...您是想问C Runtime的内存管理么?)
13. 统计一个文件的行数(wc -l 但是当时没答上来——裸考的代价)
14. 一个二进制的程序跑起来的它各个段在内存中的分布是什么样的
15. 最后一个问题,static这个修饰符在C和C++里面有什么区别(区别?C/C++?真不知道啊,为什么这么问啊;后来才知道问的其实是静态局部变量、static method/variable这些)

17分钟结束

### 阿里菜鸟(内推) 一面挂
腾讯刚面完没几分钟又接到阿里的电话

1. 介绍一个你认为做得最好的C++项目。由哪些模块组成呢?有什么难点或者亮点吗?
2. 面向对象语言的三个特征是什么(封装、继承、多态;当时没记住这个,在那瞎聊思想)
3. 你了解多态吗?(面试官还是忍不住..)
4. C++对象模型中是如何实现动态的绑定的
5. 编译器会给空类会生成哪些函数
6. 一个描述起来很复杂的C++的类的题,主要考察的点在内存泄露,感觉更应该现场问;聊了快10分钟
7. 用过STL吗?用过哪些容器?解释一下map底层的数据结构的实现?(红黑树)那么解释一下红黑树?
8. 一个C语言的程序从高级语言到二进制的程序都经过了哪些过程
9. gcc要引用第三方库的时候编译命令要加什么东西?如何找到头文件目录?
10. 用过gdb做过调试吗?想要看当前运行到的调用堆栈用哪个命令?
11. linux线程同步的方式都有哪些?(说了一大通说成进程通信了;改回来信号量、锁..)

20分钟结束

### 搜狗 两面等消息
之前投简历没动静,但实验室的同学接到了面试通知,于是拜托捎简历过去,后来约到面试。

1. 有序数组二分查找;然后引申:变成二维数组,其中元素按行升序按列升序,查找(最优解记得是O(m+n)?)
2. 求两个有序数组合并后的中位数(一般解O(m+n),优化解O(lgm + lgn),(update)评论里有童鞋提到leetcode上有更好的解法(第4题))
3. 有序数组查找给定的x之前的那个数(其实就是C++的lower_bound,但是边界条件挺棘手)
4. 把二叉搜索树原地转化为有序双链表,左孩子prev,右孩子next(递归)
5. 实现一下bitmap的get/set方法

### 豆瓣 offer (平台组)
官网发的邮件,几天后收到回复要在线笔试。那几天已经有点累了,下午整理完之前的投递想着顺手做了吧,也没很在意。点进去链接是豆瓣自己的页面,邮件里说一个小时但页面上也没有计时显示,感觉好随意。三道题,目测会是人工判题。

1. 读取一个2G的文件需要多久?为什么?还有哪些因素会影响读取速度?
2. 给一个二叉树,翻转所有偶数层节点的左右孩子,奇数层的节点不动,求翻转次数
3. 给10个有序数组,求不重复的数的个数(就是个k-way merge,但因为看到10,直接暴力merge)

做完交了就没再想了,没想到晚上就接到HR电话直接给offer了。豆瓣好任性。

### 知乎 两面挂 (后台开发)
一面:

1. 说一说常见排序算法和它们的时间复杂度;快排什么情况下O(n^2)?
2. merge两个有序数组
3. hash表扩容(realloc rehash);冲突检测
4. cache是什么东西(读写速度,成本,局部性原理)
5. 缓存替换策略有哪些?写个LRU cache,伪代码就行(开始误解成LFU了)(最后没写只说了下思路,hash+双链表)
6. 介绍一下线程和进程
7. 如果一个进程里有多个线程,其中一个崩溃了会发生什么(误解了一大堆,最后明白他想问的点是线程之间内存空间共享)
8. 介绍一下TCP三次握手/四次挥手、流量控制、拥塞控制

二面:

1. 写个Python的decorator实现打印函数的执行时间
2. 项目里的线程池是怎么实现的?用了什么数据结构(我说只是用了vector,然后说这样的缺点是时间控制不精确,比如一个线程里排队了10个1秒的worker,另一个排队了2个50秒的worker)怎么改进?(他先说了一个缺点,队头的worker会卡死后面的等待者,所以需要设置一个超时)(然后我说改进,不在每个线程设置等待队列,而是一个统一的队列,哪个线程空了自己去队列取)(他又说了一个注意点,队列长度需要限制,太长就拒绝接受任务,否则会内存爆表)
3. 知乎阅读量排名top-k。不是算法题,聊了半天聊不到点上,后来他说其实想问的是redis...
4. 设计个人博客数据库表,数据库我很弱,勉强画了画,他问为什么不建索引,我说个人博客不用吧,就几百篇文章... 他说那也要建啊。
5. 其他都是瞎聊,都不知道他想知道啥
感觉二面表现并不好,回来就再也没信儿了

### 360 三面offer跑了 (后台开发)
一站式的,三面每一面都是当场出结果,如果都过了就回去等消息。

一面:
自我介绍,聊项目,项目里问问题:

1. 为什么选Python2不选Python3?3和2的区别知道哪些?
2. Windows下还是Linux下?(跨平台的);Linux哪个发行版?(Ubuntu)
3. 用的什么IDE?(Qt Creator)
4. gcc, makefile
5. 用线程池的目的?线程池的实现?等待队列用什么实现的呢?
6. 介绍一下Qt的signal/slot?
7. 其他的libevent之类东西了解过吗?(没有...)
8. select/epoll的区别(主动提的,问socket的这些异步模型算吗?强行找问题)
9. 面试官还是想问libevent,可我实在没用过没法聊啊,看节奏不对我就解释自己平时做东西喜欢造轮子啊这种(强行贴金)
10. TCP/UDP的适用场景
11. C++实现一个队列,设计一下类的成员变量、方法
12. map的底层数据结构是啥;hashmap呢;适用场景呢;区别呢,数据量方面(占用空间)?
13. 分布式计算和分布式存储了解吗?(不了解..)
14. 除了Python和C++其他语言有用过吗(Java, JavaScript, Haskell)
15. Linux下怎么查看进程的CPU占用、IO占用?(就知道个ps..);网络连接?(netstat..);
16. Python想要调用C++该怎么做?

二面:
二面感觉是压力面...面试官特别咄咄逼人,不过感觉不是他本性哎,果然问题完了就和蔼多了。大家如果遇到压力面别慌,自己觉得对的一口咬定就好,实在不清楚就老老实实说不清楚。

1. 你的项目里用到TCP进行消息传递,两个相邻的消息怎么区分开?(后来知道这个就是面试中的“TCP粘包问题”)
2. 怎么解决不同平台int型位数不同的问题?uint32_t是在哪定义的呢?(stdint.h 我是怎么记得住这种东西的)
3. 为什么要用消息头部加长度的做法呢?
4. TCP是面向流的面向连接的对吧,解释一下什么叫连接?(开始聊TCP三次握手~~)
5. accept是在三次握手的哪个阶段?(三次握手完成后)确定吗?确定吗?(确定...三次握手是操作系统自己就弄了,都不跟我们应用层说)
6. 假如三次握手后我没有调accept,那么你能感知到我是否调用了accept吗?(不能,但是我能朝你发消息)能发成功吗?(可以的吧,我发过去的消息就是被操作系统缓存在那个buffer里)那你可以一直发吗?(那不能一直发,如果buffer满了之后,那你那边控制的那个叫...receive wnd就减成0了)receive wnd是啥?(接收方维护的一个变量,用来做流量控制的)
7. 我现在有两个线程,我现在希望一个线程打印A,一个线程打印B,最后的效果是在屏幕上轮流地ABAB,怎么写?
8. 如果让你设计一个hash表,你要怎么设计?(这个题给你们Java童鞋,把ConcurrentHashMap源码翻个滚瓜熟就天下无敌啦)
9. 现在总的内存是2G,当你的hash表占用内存1G时,你这个东西还能接着用吗?(上一题用的是线性探测+元素满时扩容rehash的做法)这个限制下怎么能扩容到2G?(实在想不出来,大家谁知道告我一声 (update)194楼的童鞋有解法,赞)
10. C++11/14有什么了解(不怎么了解就说了auto和lambda函数)

HR面常规就不说了。
三面完回去等消息,本来说是一周内给消息,结果一周过去状态变成了等第二批面完再决定,这时当时一起三面过的小伙伴已经有挂的了,猜测自己就是成了备胎。
4.15第二批面完状态还是没变,查多了没意思后来也不查了。4.20号腾讯二面完回学校的路上忽然接到HR电话,开始感觉在试探我,客套之后问同学那你现在有拿到哪些offer吗?我说豆瓣、融360、头条。HR一听头条语气就变了,有点语无伦次的感觉,各种泛泛地说我们这边岗位其实比头条那要好呀、找工作不止要看公司名气还要看工作氛围培训机会呀等等等,感觉是不是本来抱着HR二面挂我的心然后发现剧本不对的样子, 问了好几次那如果我们给你offer你是会考虑的对吧,我说当然会考虑啊,最后就说那我们尽快走流程给你发offer,我说好的谢谢。然后就没有然后了。

### 融360 offer (PHP开发助理)
十点半到公司十二点多两面加hr面完成。一面先聊项目,然后问排序算法都了解吧,说了解,然后名字和复杂度都说一遍(冒泡、选择、插入、快排、归并、堆排、基数、计数),他说那你写个堆排吧。吭哧吭哧写了四分之三的A4纸,发挥超常一次到位毫无破绽。又聊了聊复杂度接下来就变成唠嗑了。二面也是唠嗑,面试官还说你做这个(PHP业务)浪费了,建议去BAT试试(谢谢面试官的诚恳)。HR面常规流程走完,几天后给了offer。悄悄说一句,实习工资跟头条华为是一个档次。

### 微软笔试 虐成狗
MSRA挂了以后不死心,官网投加网上找前辈内推(不过据说微软内推没什么用,该走的流程还是得走)。其实感觉这两年海内推都没什么用了,还挂简历。
微软笔试没有摄像头监控,后来发现也不需要有,哪怕你纠集一帮人一起做,也是大概率一帮人一起跪——真的难到怀疑人生~ 好歹自己前一天晚上还华为笔试all kill,微软却一个小时只A掉第一题的10%。
后来参加Google Code Jam第一轮,也是一小时四十分钟一道没A出来,开始自己题还没看完实时动态里别人已经一个又一个A掉,终于知道以前以为能进微软、Google多么naive~

### 完美世界 一面挂
### 趣加游戏 两面挂
### 网易游戏 拒面试
发觉不是一直朝游戏这个方向走的话去面游戏公司真是没什么优势,大家找准自己的定位吧;网易游戏二面要去杭州,还是工作日,想想将来也不大会去就拒掉了

### CVTE HR面挂
这家公司以前从来没听过,但是招聘季各种群里总是有人问,让人怀疑是不是雇来的托。公司在广州本就没什么想法了,流程还拖得很长(都是远程视频面),笔试完以为结束了通知一面,一面完以为结束了通知二面,一面二面间还让做心理测试题(真的是心理测试,竟然有“你最快乐、最伤心的事是什么”这种简答题)。二面直接是个妹子没想到(HR了这就),又问了好多心理题,从来没见过这么奇形怪状的面试:你是什么性格呀?你的父母是什么性格呀?为什么你的性格和你父母的不一样呀?(我说可能他俩的隐性基因在我身上显性了吧,黑人脸...)你的世界观是什么呀?(我都乐了,说这个问题也太大了吧)
最后问校招的期望薪资是多少,我说跟同学也聊过,北邮20W应该是白菜价,所以期望自己在20到30W吧。HR表示让她受jing了~ 后续就再也没有消息。

### 华为 offer (云存储)
华为的两面水到让人心虚,跟别家完全不一样。
一面面试官是个超级nice的大叔,说话温文尔雅特别和善,全程感觉没超过10分钟,就聊了一个网络模拟器的项目,而且是我说一点他表示强烈赞同然后替我补充上三点。出来一会儿就二面了。
二面也聊项目,题的话只有俩:

1. 知道哪些最短路径算法?(迪杰斯特拉和弗洛伊德);那你给介绍一下吧,(Floyd我忘了,就只给纸上写写画画讲了下Dijsktra的思路,也没写代码)
2. 智力题:现在有一只大老虎一只小老虎,一只大熊一只小熊,一只大狮子一只小狮子。六只动物都在河的一边,只有一只船,每次能坐两只动物。大动物都会开船,小动物里只有小老虎会开船。当一只小动物不跟爸爸在一起时,会被别家爸爸吃掉,怎么能让六只动物都渡过河去?
第一问先问用程序怎么实现。(说了个状态树深度优先搜索);第二问那你给出个具体答案吧,憋了好久没憋出来,放弃,说您把答案告诉我吧。他说了一个,然后说这个题其实是他四岁的儿子碰到的,然后他儿子做出来了。无地自容ing,补一句“您儿子好聪明啊”。

二面完就结束了,拿餐券去楼下食堂吃了个饭。华为的饭还不错,就是总部离学校有点远。

### 头条 offer (基础架构)
头条的经历一波三折,最初论坛上找人发邮件内推后台岗,还收到回复“非常优秀,已推”,以为希望很大,结果等了一段时间去问内推人说是“简历未通过”,说可能是部门HC满了吧,建议我换个岗。只好从正常流程重投了算法岗。后来笔试4A3,拿到面试。
头条面试也是一站式,三面全技术面。等待区很有特点,前面坐一排打电话的HR们,哪一面挂了HR直接报名字“XXX非常抱歉你的X面没有通过,欢迎秋招时再来”或者“XXX恭喜你X面通过了,请稍作等候给您安排X+1面”(360是微信上查询,不过的话悄悄走,过了的话大屏上显示)(顺便吐槽一句头条的等待时间太长了,三面加起来面了3个钟头等了3个钟头,有同学一路面到晚上10点)
等半个小时被翻牌子,进去面试官第一句问你报的是什么岗,我说算法,但是我本来是想报后台的,当时内推简历挂了没办法改了岗。他问那你现在想报什么,我说还是想后台。面试官很不错,联系HR说这位同学想报后台,你看能不能给他改一下。HR去弄。面试官看我的简历说我看你这算法还可以嘛,为啥要报后台呢,我说咱们这算法岗主要是数据挖掘和机器学习对吧?他说是。我说这方面我了解的都比较浅,怕是达不到要求。后来HR回来说今天没有后台岗的面试,要不你明天再过来吧。我说好,就回去了。第二天两点过去,最后一直面到了晚上八点。出门夜色茫茫。

一面(50分钟):
先聊项目十几分钟,然后基础知识:

1. STL的源码有没有看过(没有..);vector的实现(之前的面试都把我面出惯性了,脱口而出红黑树,面试官“嗯?”,猛然意识到错了忙改口“啊不对是数组”,然后就聊内存管理啊扩容啊之类的东西,聊到new,聊到操作系统内存管理,最后问到内存碎片整理我就不会了,下一题)
2. 多进程通信方式(这个大家自己动手写一写是最好的,我没写过,答案也背不利索,还说错了一些(锁是多线程的不是多进程的?))
3. 多进程和多线程有什么区别(还是很常规的问题,现在我想着如果大家自己做过一个小操作系统,这种东西是不是直接聊出风采;我说得并不好,一深挖就露怯,纸上得来终觉浅。比如会问到进程和线程的适用场景(需要有经验),进程切换比线程慢的原因(需要懂原理),切换时需要保存哪些数据,问得很细,光说PCB都不够,比如我说切换打开的文件符和资源什么的比较慢,面试官一针见血地说这些东西本来就在内存中,切换的时候难道需要关闭吗?问到最后只好承认并不清楚了)
4. 平时有用多进程写过软件吗?(有,说了个项目,说完发现用的是多线程);那么多进程和多线程各有什么优缺点呢?(说了资源隔离、安全性,能想到的就这些了)
5. 又聊了几个小项目,vim语法插件、快速alt-tab、简单虚拟机、2048 AI,面试官会从各种角度问,感觉目的就是要分辨出这些东西你是真的做了还是编出来的
6. 常用排序算法有哪些?堆排是怎样的?大根堆是怎么去调整的?
7. B+树了解吗?(不太了解,硬着头皮聊了聊原理,感觉倒是达到要求了哎)
8. HTTP的状态码知道哪些(2XX, 3XX, 4XX, 5XX)

算法:

1. 两个有序数组求第k小的数(先说O(n)/O(n) merge,然后一路优化时间空间到O(lgn)/O(1))
杂项:
2. 平时你写代码调试之类的遇到过吗?(Python的话一般就print;C++的话复杂一点的去VS;主要还是靠思考吧,打log);性能问题怎么调试?(profile);那么你优化的例子是什么?(没说好,记错了场景了,被戳穿)
3. 源码看过哪些(看得不多,可能只Python的库看过一些);开源库用过哪些?(PySim,其实用过不少,一时都没想起来)

二面(30分钟):
二面面试官语速很快,一个问题接一个问题,想起来《社交网络》电影里妹子评论跟Mark约会就像跟一个跑步机约会,exhausted,哈~

1. 介绍一下hashmap的插入和查找时间复杂度?描述一下插入过程?hash值怎么找对应的slot?(求模);冲突怎么解决?(线性探测、链表);工业上常用的冲突解决是什么方案?(Python好像是线性探测?)确定吗?(不确定..);那你介绍一下这两种方法的优缺点吧?探测的方式你怎么知道要查的在哪个槽(比如之前的内容有删除)?(懵了几秒钟,面试官直接说这个先讨论到这儿吧,然后给介绍了工业上使用一般是链表方式);如果插入数据越来越多,会把O(1)的操作退化成O(n),怎么解决?(扩容、rehash);hashmap你有在多线程下用过吗?多线程场景下的优化有什么想法?(Java童鞋们,你们的ConcurrentHashMap又来啦~ 但是我自己当时没见过,只说了个读写锁)还有更好的办法吗?(思索)你有了解过吗?(没有);面试官果断没让我再想,给介绍了一下Java里的做法(分段锁)
2. 我看一面反映你对网络还是比较了解的对吧?那么了解HTTP协议吗?HTTPS呢?HTTPS主要的好处是什么?(中间人攻击、加密);那么它是怎么实现加密的?(非对称交换密钥,然后用密钥对称加密消息)

算法:

1. 对一个单链表进行排序(先问能不能放进一个数组,囧~ 后来想到归并;代码写完,面试官看了看说有一个致命错误,我拿回来研究,还好很快(半分钟)就找到了,不然感觉我可能会挂)
2. 有了解redis吗?(最近刚开始学);那你介绍下学到的东西吧?(真的刚开始学...);面试官说好吧,给介绍了一下redis的sorted set,说了下支持的操作,然后问如果要你实现你要怎么做?(想了个平衡二叉树);那么我想获取两个值之间的所有元素的话用平衡二叉树怎么做?(想了想,还是能做的,每个节点加上后继指针);哎,你除了平衡二叉树这种结构还知道别的支持lgn插入的结构吗?(没想出来)面试官给介绍了redis里的skip list

三面:
三面是部门leader吧?超年轻,后来知道是在Hulu工作过的大神。

1. 描述一下socket编程服务端做的事情(bind, listen, accept, 把这几个函数下面操作系统干的事儿也聊了聊,当初写那个网络模拟器真有用,顺便把三次握手也聊了)
2. hash表扩容;如果想要在扩容的过程中不影响读写,应该怎么做?比如200MB的hash表要扩容到400MB,rehash的过程可能得用掉60ms,这60ms里我不想所有的get和set操作都被block掉。(聊得很细,没碰到过这种问题,所以一个个方案想一步步细节改进);如果问题扩展到了多台机器上,即每台机器保存hash表的一部分,现在我想增加一些机器,还想让元素尽量平均地分布在所有机器上,怎么做?(知道这个知识点的童鞋肯定一眼就明白,“一致性哈希”,但是我当时又是不知道,现想现改最后总算给出了一个还可以接受的方案)
3. 给一棵二叉树,找到这棵树中最大的二叉查找子树——即找到这棵树的一棵子树,这个子树是二叉查找树,而且是节点数最多的那个(代码写得又臭又长,而且还有瑕疵,最后一边讨论一边改)
三面我一度以为自己要挂了(之前在外面等的时候听到过有三面未通过的同学),问题都很陌生,答得也磕磕绊绊,但竟然是挺下来了

面完和面试官一起在头条的食堂吃的饭,还加了微信;再后来HR送一批三面过了的人出去,一共6个人吧,在过道里聊了聊,全是北邮人(骄傲~),问旁的几位一个个都是手握阿里腾讯的offer要么就是本科在百度实习过,我那渣渣实习都没脸说了。
HR说一周内给答复,果然一周后同一天同一点(下午2点)接到电话给了offer。
总体来说经历的所有面试里头条的水准是最高的,面试官问得很深也很有技巧。

### 美团 offer (大数据)
美团面试在清华那边的一个咖啡馆,包场。刚签到没一分钟就叫面试了,效率特别给力。去二楼的路上咖啡香气扑鼻。
一面聊项目,然后问了俩算法题:

1. 求一个集合的所有子集。刚听到题还小虚了下,但随后想起自己写过这种,提笔要写面试官小哥说你可以先不忙着写,这个题没有看上去那么简单。我就停了,不敢托大,转而跟他聊思路,聊来聊去总是聊不到点上,我说要不我还是先写吧,他说好。简便起见上Python,递归五行写完了。纸上好多刚才聊思路时画的东西,递给他时一下子没找到代码在哪里。看完他不是很明白的样子,又解释了老久。

        def subsets(a):
            if not a:
                return [[]]
            ss = subsets(a[1:])
            return ss + [[a[0]] + s for s in ss]

2. 一个长度为n的数组,里面存了n个数,会有重复但不知道有多少个重复,找出那个重复的数(任意一个都行)
先说了个用hash统计次数的做法,让优化空间复杂度;
说那可以原地排一下序,时间上变成nlgn,不过也有O(n)的排序算法(这个其实说的不严谨了,计数排序的话没法原地,跟元素取值范围有关;基数排序32位的话是O(32n)想比O(nlgn)快的话n得大于2^32, 4个G了都)
小哥说行吧,但是hash的那个办法你能不能再优化一下空间复杂度,我想啊想说hash那个空间复杂度是O(n),如果还要小那我感觉就只能是O(1)了
小哥说那我们再加一个限制条件,就是说这些数字也是1到n的,这时能不能优化空间复杂度
就说了个把每个元素各归各位的办法,小哥说可以,但似乎还不是他心中的答案
说再加个条件,要找的这个数是小于n/2的,又可以怎么优化呢
想啊想想不出来,问是要要求时间O(n)空间O(1)么,他说时间可以进一步优化,我心说再优化就是lgn了,难不成是sqrt(n)?看着不像是能有这种复杂度的结构啊。就问是说平均复杂度更低么?小哥不置可否。
只好生想,想了几分钟全无头绪,小哥说那我们跳过吧。
我说能给说一下答案吗?小哥:“我也没有答案,”(nani?) “因为我忘了..”
我还是多嘴,又问那它的那个时间和空间复杂度您记得吗?小哥说时间是lgn。我就觉得小哥肯定是记错了,随机数组不可能有lgn的复杂度的。也不好再追问,就过吧。

最后日常“我这儿没什么问题了,你有什么问题想问我的吗?”我问一共几面,说一共两面;又问了几个常规问题(入职时间要求啊岗位工作内容啊);小哥说我这边是让你通过了,转身跟旁一桌的面试官说X姐我把他推荐给你吧,X姐说我这边系统里还排着人呢,统一安排还是先下去等吧,我就下去了。
等了40分钟没动静,人放在桌子上的小零食都快吃光了。跑进去问HR,HR惊说啊你刚才下来没找我安排二面吗?我说没有啊心想这东西怎么是要我自己找的,他跑上去问面试官,下来后说你刚才应该找我安排二面的,二面面试官空了好长时间,现在人家要回去了,要不这样我们之后再给你安排到公司面试吧,你先回去。
就这么稀里糊涂回去了,路上才想起应该要个HR的电话的,不然他不打过来我这岂不莫名其妙就挂掉了。
一面之后好久杳无音讯,那天面完完美世界出来接到美团电话,说同学你不用二面了一面直接通过了,(nani?) 那你什么时候能入职呢?我说六月中旬,他说我们这儿希望尽快入职啊,不能提前吗?我说不太能。回说那好吧我和部门再沟通一下。
再次杳无音讯好久,已经默认挂掉了某天又接到美团的电话,说我们这边部门领导想见见你,约一下面试时间吧。(nani...) 约在了周五,还给发了封像模像样的面试邀请函。
然后约定面试时间的两天前晚上凌晨,蹲在卫生间的我忽然又收到美团发来的一封邮件offer。(nani?!)
二面还是去了,说是聊聊其实又来了场中规中矩的面试。不过很感谢面试官,最后我直说现在在腾讯头条美团之间纠结的时候,他给了很中肯的建议,并没有无脑夸美团。谢谢。

### 京东 三面offer跑了 (搜索)
京东的面试流程真有点拖沓,三面分在三天里,每次约好的时间到那先等上至少一个小时,还有从上午等到下午的。
一面:

1. 静态库动态库有什么区别知道吗(静态库编译时就写入可执行文件了,动态库运行时才加载;内存上动态库可以多个进程共享,静态库每个都有一份)
2. 进程有哪些运行状态(就绪、运行中、等待、停止);运行状态什么时候会切到就绪态(比如时间片用完);什么时候会切到等待(比如遇到IO)
3. 空类多大(1字节)为什么(因为编译器要保证每个对象在内存中都有不同的地址)
答完面试官说“这个题看来你还是刷到啦”,我跟他一块儿哈哈一笑
4. set的底层数据结构是什么(红黑树)红黑树有啥特点吗(是一个平衡二叉树,然后插入删除查找都是lgn)它怎么保证平衡呢(跪了,红黑树我就知道这么多了,所以到这里开始瞎说,被指出错误就停了)
5. 现在我这个set里每个元素是都是复合类型,比如struct或者class,这就意味着有多个成员,那我要判断一个元素是否在这个set中的话,是不是要struct中的每个成员跟节点中的每个成员都相等,才能判断存在?(这个被他带坑里去了,也是自己好久不写C++,其实他想问的是重载operator<,自己当时说错了一堆,最后在他的不断质疑下才想起来这个)
6. 抽象类是什么(有纯虚函数的类)那抽象类能实例化吗(不能)为啥(因为假如能的话,我们去调用它的那个方法是没有实际可执行的代码的)
7. linux signal有什么作用(可以在进程运行过程中暂停的它的运行然后让它去做另外的事情)具体在程序中要怎么做(注册一个signal提供handler)你写过这样的程序吗(写过)哪些信号注册了也没用(不知道了,也就写过那么一两次)
8. TCP的TIME_WAIT状态啥时候出现的(已经在各种面试中被问到过好几次了)为什么要有这个状态(它可以保证重发丢失的ACK;还可以防止之后重用这个端口的进程不至于被对端认成前任(假如ACK包丢掉的话))
9. 虚表是什么东西(聊vtable)如果有多重继承的话这个虚表长什么样(这个真不知道,被教育了一通)
10. TCP粘包听过吗(感谢CVTE,当初是他家面试听到这个名词的,概念其实知道但没见过这个名字)
11. C++中的对象要新起实例化的时候能不能用malloc函数去实例化(不能,malloc只分配内存不做初始化)
12. select/epoll;不过深挖了一些我就跪了,比如select描述符个数限制是多少(1K),能不能改怎么改等等(不能,想改得编译内核)
13. 构造函数能是虚函数吗(不能,但是理由比较糊涂,他给的理由是虚表(指针?)要在构造函数中去初始化)
14. 一致性哈希算法听过吗(没听过,直接过了;后来回去查发现这东西就是头条三面的标准答案啊,京东你这么搞是不是有点瑕疵呢)
15. 进程和线程的最显著区别是什么(线程内存共享,进程通信比较重);那么进程间通信手段有哪些(这个问题都回答疲劳了,不过面试官一深挖我又捉襟见肘了);共享内存有啥缺陷(没聊到点上,确实是自己用的少没经验);如果有10个进程两两一对儿要通信,用一个消息队列能不能行(能行,但原因没说到点,还是没用过不熟悉)
16. 如果有一个服务要求不能启动两次,用什么机制来做(说写bash每次启动前检查(ps,grep))只能用bash吗,纯C程序写过没有,怎么做
17. 哪些时候会调用构造函数(就是问C++的那几个拷贝赋值构造,我自己老是记不明白)
18. 友元函数用过吗;友元类有什么特性
19. 好我们最后来一个算法题:有一个无序的100万大小的数组,求它的中位数(最简单的就是排序咯,面试官步步进逼拿这个问各种复杂度,态度让人有点不爽;不过这里学到了以前一直忽视的一个东西,就是复杂度中的常量不能不看场景地忽略,100W的数组用基数排序是没有nlgn的排序算法快的)有没有更好的办法?(就是快排partition的那种做法了,跟他聊find_kth,聊着聊着他又笑了,说看来你还是见过这个题,我就有点儿怒了说不是我见过,这个是算法导论上的啊;内心OS:特么刷题还有错了?不刷题答不上来你们给挂掉,刷过答上来你又讥讽是刷的,到底要怎么伺候嘛?)
那再问一个吧,如果一个数组,也还是那一百万,它是已经有序排好的,然后其中有一个成员它重复次数很多,重复超过一半啦,有什么办法能快速找到它。
我有点儿懵,这个题你排好序是想问什么,确认了一下题意没理解错,就说中间那个数就是嘛。面试官说除了这个还有别的办法吗?这...还要什么别的办法...我说这不已经是一个O(1)的办法了吗,他说嗯..那有没有比他复杂度更高的办法呢?我...(Σ( ° △ °|||)︴),哎呀从来没见过这么贱的要求啊~ 聊了会儿我始终很不安,跟他强调为什么我都O(1)了你还不满足。
于是他改了题目,现在重复次数不是过半了,只是超过1/3,怎么整。想了想说了一个滑动窗口的办法,又是聊起来处处沟通不畅。感觉这个面试官总是轻蔑讥讽的态度让人很不舒服,莫不也是另类的压力面?(猜测更可能是京东本来就这么大压力吧[摊手])

二面:
好吧二面我写不动了,好玩儿的地方就是本来都进行到“你还有哪些问题”这种男生权利环节了,结果问了几个问题(素颜照?住公公家住婆婆家?~)后面试官看一眼表说我们时间还有,要不做几道算法题吧。臣妾也只好答应~
后来就是许多天后接到电话说要给offer,是个男的感觉不是HR,前面都聊得好好的,入职时间工作地点都说完了,他随口问了一句你确定了吧?我说还要考虑一下,他直接乐了,说还要考虑吗?我说嗯,那边就非常迅速地“那好我们之后再联系吧”就把电话挂了。后来舍友已经接到邮件offer了我还没动静,再后来就收到拒信了。

### 腾讯 offer (SNG即通平台 深圳)
内推挂掉,这个是走正常流程笔试完面试的。地点在清华那边一个酒店里,早签到可以早面试的安排很不错。
一面:
运气太好,面试官是本科师兄(虽然不认识)。于是感觉一点儿没有刁难,项目就聊了好久,然后随便问了几个简单问题就过了。

1. 找一段代码里的错误,大抵语言(C++)过关就没问题
2. 写一个函数删除字符串中的空格
3. 两台电脑用一根网线直连,发现带宽总是跑不满,会是什么原因?(先说是不是线不好,或者电脑不好(网卡),面试官尴尬说也行,如果排除硬件问题呢,恩..可能接收端操作系统的buffer太小,或者发送端进程太多)
4. 判断一段代码的输出,还是C++基础

二面:
项目聊完让写一个memcpy,因为有了MSRA被虐的经验所以对这种貌似简单的题很警惕,写的时候把各种边界条件包括两段内存有重叠的情况都考虑进去了,写了快一页纸,给面试官看然后聊的过程中发觉这个题可能本来没这些要求,但能写这么严谨大约是惊艳到了。然后问哪些点可以优化,因为自己为了可读性定义了好几个函数,就说哪个哪个可以inline掉节省一定函数调用的overhead,问还有呢,说可以把void*指针转成机器支持的最大字长类型,比如uint32_t,这样每次拷贝可以多一些数据,降低O(n)里的常数,不过要注意边界条件就是尾巴上可能不够这么多字节,说可以那你写一下这部分的代码吧,写之。
完了又聊了会儿项目就结束了。

### 搜狐 offer
搜狐当时已经不大想去了,但已经跟人约了时间所以还是去一下。到地儿早了快一个小时,找前台妹子人妹子爱答不理地让我到点再联系HR,在楼外坐了好半天。联系到HR领上楼等,看着搜狐的环境还是挺不错的。一起等的还有一个社招的小哥。
过会儿面试官过来,胖乎乎感觉很geek的样子,问的问题也相当..难,感觉都是他现想出来的,小哥应该挺有水平;一面面了我一个半小时,都快扛不住了。

1. 一个工厂,在接下来的n周里面,每周要交付的产品数量是y[i](各周不同),这些产品可以是当周生产的也可以是之前的周里生产的所以本周直接从仓库里拿,一开始仓库是空的;如果你要生产有一个生产成本是c[i]元每件,然后还有一个仓库储存成本x,单位是每件每周多少元;问要完成这n周的计划所需要的最少成本
2. 给一棵二叉搜索树(可以有重复,如果值相等只会在左子树),再给一个数x,问小于等于x的节点有多少个
3. Python题

        class X:
            def f(self):
                pass
        a = X()
        a.f is a.f  # 问这个表达式结果是啥(True/False)

4. foo.bar这种属性访问可以被重载吗?(可以,`__getattr__` 或 `__getattribute__` 但是两者的区别记不清了)做过这种事吗?(做过)为啥做的呢(写过一个each(),可以简化for循环的写法)
5. 写一个add函数,支持这样的操作:add(3)(4) == 7,小哥说这个我估计你两分钟就能写出来,确实写出来了,然后小哥坏笑说所以其实我真正想问的不是这个题(我@#!%@#),题:
写一个add函数,支持这样的操作:add(1)(2)(3)(0) == 6,即可以调用任意多次,最后一次传入参数为0时返回求和的结果
6. 你有考虑过这东西用C++怎么做吗(用class重载operator()返回*this)还有吗(...呃,应该比较黑魔法的有模板,但是我不会写)
7. C++的static关键字是干什么用的(天终于有一个正常题了)
8. C++写个单例
9. C++比较新点儿的特性有了解吗(auto, lambda...)unique_ptr和shared_ptr知道吗(知道,但是臣妾真心没怎么用过)move呢(返回值无需拷贝)
10. vim你一般会配什么插件用吗(我自己写过Python和C++的语法插件,用的话基本就只语法高亮这种,我其实更多是把它当一个文本编辑器来用)
还是问一个吧,想要输入n行文字,每行都是"there are 99 bottles on the beach"这种,那个数字是按行递减的,要怎么输入(先输一行,然后录个宏,这个宏就是拷一行下去,找到这个数,ctrl-x减1,然后把宏执行100次)
11. linux命令,找出一篇文章中某个单词的出现次数(好吧,我不会,linux没用过那么多,瞎猜是用sed或者awk做)
12. nginx的日志,给描述了每一列的含义,其中有一列是URL,现在想找到一段时间内(比如最近一小时)访问量比较大且出现了404的那些URL,最快的做法是什么(他想要的不是写clean problem的那种top-k实现,而是有什么用什么最快完成的方式,勉勉强强说了一个,实在是linux没那么熟)又问那如果你有网呢,你会怎么查这个问题的解决方案?直接让我拿手机出来搜,我手机正录着音呢怕不好看就把录音关了,于是后面还问了什么我就都不记得了~

二面的话面试官过来啥都没问成,他说他做Java的他们这边几乎都是做Java的,好不容易找了一个会C++会Python的来面我就是那个一面面试官,我这真没什么东西能问你呀,于是二面十分钟就结束了。问了他他们这边做什么实习生来了会做什么,介绍说这边是搜狐北京研发中心,他们主要做docker分布式计算,像我来了的话主要就是写shell脚本(我...心说你们一面那难度招进来就写shell脚本是不是有点儿坑)

### Amazon offer (Kindle Tech)
3、4月份投的外企大多都没动静(IBM, Oracle, Intel, FreeWheel, VMware, Yahoo),亚马逊这个来了想着就去一下看看吧。当时参加宣讲会HR有说面试准备一下英文自我介绍,之前有同学去了说一面全程英文,但我实在懒得弄了,随便想了想自我介绍。最后也没用上,两面都是中文,倒是那边的员工说话确实爱蹦单词儿。

一面:

1. 算法题:求树中两个节点的最低公共祖先(lowest common ancestor, leetcode原题),不过是用情境题的形式问的,而且可以自己设计节点的数据结构,所以我直接加上父指针降低难度啦~
2. 设计题:做一个界面,会用到多种Dialog,比如第一种PopupDialog只有一个OK Button,第二种ConfirmDialog有OK/Cancel Button,第三种QuitDialog有OK/Cancel/Abort Button,设计一下Dialog的class model——对了还有一个需求就是PopupDialog是不能改变大小的,另外两个可以
然后又聊会儿项目就进入“你有什么问题”环节了

二面:
面试官上来自己先自我介绍(蛤),然后说了下这场面试可能有哪些环节,感觉很周到。还说看了我的github page——嗯..个人主页这种东西确实偶尔也是能加分的,因为比较少人有,看到时都会忍不住点进去瞅一眼。
然后聊项目,项目中引申出各种问题:

1. Python和C++有什么区别你觉得
2. 我比较好奇Python对多线程的支持到底是怎么样的?(前面他说自己对Python不熟,聊到这儿我感觉他是假装的,想看看我呈现出来的Python水平有没有水分;聊了GIL锁)
3. 你刚才说C++的性能高,那么高的原因是什么
4. 从面向对象的角度考虑,你觉得Python是一个面向对象的语言吗(我说是,然后说了Python的class、继承、多态之类,,他反驳,我又跟他聊Python表面上看无类型但实际上内部是强类型,而且写代码的时候克制自己的话完全可以符合面向对象的那些标准,不过讨论到最后他还是说anyway~ 保留意见的样子吧)
5. 介绍一下你说的面向对象的那些特征(封装继承多态)
6. 说一下线程之间的消息传递(...)线程消息传递本质上是怎么样的(线程之间堆空间是共享的,所以在共享空间中放一个数据结构,大家都去访问这个结构)
7. 那么进程之间的消息传递呢(...)进程之间传递的本质是什么呢(把进程A地址空间里的一段内存数据,借助操作系统的帮助,拷贝到进程B的地址空间中。面试官反应:"cool~")

算法题:

1. 是leetcode上那个贼隔家偷钱的原题(198题),但是我忘了解法了...生想,给出个n^2的dp解法,第一次在白板上写代码,感觉滑溜溜的,后来在各种讨论和提示下优化到了O(n)
用的Python,dp是用递归形式写的,然后跟他说这个递归函数得加个memorized的decorator才能做到真正的dp,他就让写下那个memorized,写完他就此问题跟我聊了半天到底什么是dp
中途忽然问了句我写的那个decorator的复杂度是什么,我愣了一下,它的复杂度?想了想这是想问啥,想不出什么坑,说就是O(1)呀,它只是对一个函数做了下修饰,并没有任何循环的操作。面试官反应:"cool~ cool~"
2. 求无序数组的最长递增子序列
又是忘了解法,现想只想出来个n^2的做法,后来苦思冥想也没做出优化,,不过面试官说没关系没关系第二个问题没有全答上来也是OK的

二面完就让回去了,一度以为没啥希望了吧,二面很一般,,但是当天下午就接到HR电话给offer了,意外之喜



经验教训
--------

1. 算法
leetcode要早刷,研一就可以开始了。越早开始越能发现自己的不足,互联网公司面试,90%都会问算法,这是避不开的;另外刷的时候,不要只追求数量,搞懂搞深入达到能举一反三的程度才是最好的,有些不太会面试的面试官可能被你背原题糊弄过去,但有水平的面试官会各种深挖各种引申,这时候只背题就捉襟见肘了。

2. 简历
有机会的话尽量多搞些能给自己简历加分的东西,比如大赛成绩或实习经历,这俩我都没有,只好写上一堆自己瞎捣鼓的个人项目。当好未来猎头的时候感觉很明显,只有那些可以明确量化的东西放在简历上才能吸引眼球,只写项目的话,面试官很难从一段描述中判断项目的含金量,很可能别人本来很水的项目好好包装一下用些高大上的名词看上去反而比你的更有吸引力。所以这方面实在不行就去贡献开源项目吧,我自己没弄过,也不知道性价比有多高。

3. 套路
面试的一般套路就是先聊项目,你的项目面试官很感兴趣的话直接就能聊过面试时间的一半,接下来可能随便水两个算法就过了。如果项目不行就会被问很多基础知识了,大抵都是语言、网络、操作系统(有些也问数据库,我数据库很菜,所幸没怎么被问到过),这些刷面经都可以刷到,查缺补漏就好了。有些面试里基础知识也会挖的比较深,能深入理解最好,但要是时间紧迫就还是追求覆盖面吧,别有太多盲点,基础知识问的碎很容易被扫到盲区。最后重头戏就是算法了,一般都需要纸上写代码,所以这个技能有必要专门练一练,否则很容易因为不适应导致本来能写好的算法写得一塌糊涂。另外有些公司不怎么问基础,全程算法,据说外企多是这个路数,但我没面过很多。

4. 心态
不要有“等我准备好了再开始投”的心态,你永远不会准备好。能准备多少是多少,一边找一边查缺补漏才是正道。经历着面试被虐也才会有更强烈的刺激和目标去提升。另外最佳的面试节奏是由低到高,先面那些本就不打算去的小公司刷刷经验,也让自己面试时不会那么紧张;再去好一些的公司;最后去dream company。每次拿到一个保底的offer,信心会更多一些,然后比这个offer次的公司就不用考虑了,可以去尝试更好的公司。我自己当时走了些弯路,把小米阿里腾讯这种公司放在了前面,果然挂掉了。心态上自己最开始也不自信,楼道里等电面的时候也很紧张,但是慢慢拿到一些offer后就相应调整自己的定位,到最后也疲劳了也不慌了,自我介绍都倒背如流了,偶尔还能跟面试官扯扯淡,到了这个状态就没什么问题了。

5. 岗位
首先不要被岗位的Job Description唬住,觉得自己必须一条条都满足才能投。其实真正面试时面试官都不会把那些要求当成硬性标准。要明白你不需要完美答出所有的问题,你只需要答得比同一岗位的其他应聘者好就行了。其次虽然不用太在乎JD,但也不能完全乱投,要在一个公司的众多岗位里选和自己最匹配的那个。我自己当初傻乎乎投了小米的算法岗(图像处理机器学习),后来面试官给的反馈是“比你强的人太多了”;头条内推挂掉换算法岗之后面试又换回后台岗,如果当时硬着头皮面算法可能就也跪了。

6. 拿到邮件offer前不要作
只有拿到邮件offer一家才算结束,口头什么的都不靠谱。人家电话要给你offer的时候最好别说你还要考虑,保不齐就碰到京东这种傲娇妹子把offer改拒信了,或者360这种抛半个橄榄枝从此相忘于江湖了。

7. 缘分
找工作真的有很多运气因素,有时候觉得面得很好-挂了,面得很烂-反而过了;还有的时候真就是点背,总是被戳到盲点一发入魂。所以结果跟自己的预期不符时不用怀疑自己,要相信有怎样的水平终能找到怎样的工作,往前走就好了。一家面完了也不用每天查进度刷群,漏接电话能打回去打回去打不回去就算了。缘分到了总是你的。

就说这么多吧(已经TL;DR了不是),最后祝大家都能找到心仪的工作~
  • 4
    点赞
  • 0
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值