一个真实的秋招案例总结(内附一大波面经)
终于把三方寄出去了,宣告秋招结束,牛客网基本上陪伴了整个秋招过程,从简历内推、刷题、面经、到offer比较。在这里感谢所有帮我内推过的师兄师姐(虽然可能大部分都拿不到内推奖励,狗头保命)和秋招过程中帮助过我的小伙伴们。是时候来回馈一波,分享一些个人的经验和教训,以及面过公司的面经~
个人情况:
菜鸡一枚,本科双非,硕士某末流985,有过一段算法实习经历,秋招投递的都是C++开发方向的岗位。bat,tmd的offer一家都没有拿到,拿了5家小厂的offer,bigo (C++音视频开发),zoom(C++服务器开发),美图(C++广告服务器开发), vivo(C++嵌入式开发),新东方在线(C++开发)。全都是白菜价,相对于牛客上的遍地的sp,ssp来说,算是一个比较真实的秋招案例了,而且这些还是在海投的基础上得来的。
秋招历程:
准备阶段:
4月份结束实习回学校,实习做的是语音算法的相关工作,和自己本身的研究方向也不相关,没有论文,也没有相关的比赛经历。回学校决定转开发,5月份身体出了一点问题,基本上没怎么复习,断断续续看了一些C++ primer,6月份开始正式准备,刷剑指offer,复习相关的基础知识,而这个时候有些公司的提前批已经开始了。7月份发现自己简历上没有开发相关的项目经历,花了一个月码了一个项目,(其实都比较仓促)。8月份,很多公司的提前批都快要结束了,从8月份开始投简历,8月中下旬基本上是上午复习基础知识,刷题,下午和晚上的时间基本上就开始笔试了。9月份面试和笔试最集中的一个月,基本上就是笔试+面试,没有大块的时间留给自己复习的,零散的时间就刷刷面经。10月份,由于国庆后有腾讯的面试,国庆七天在LeetCode上刷了dp,链表和树的专题,大概40道,然后复习了相关网络编程的知识点。
笔试面试:
从8月份开始投出第一份简历,到9月26号投出的最后一份简历,整个秋招过程中总共投了103家公司,笔试了66家,收到面试通知的30家左右(后期也推了一些公司的面试)。
投递简历基本上是按照牛客上的笔试日历来的,如果下周有这个公司的笔试,这周就优先投这个公司,然后去牛客上找内推,基本所有的简历都是内推的。每天吃完饭或者不想看书的时候就填几份简历,然后自己排好时间,因为后期每天笔试的公司都很多,没有安排好时间,笔试时间很容易撞车。
经验教训:
- 一定早做准备,一定早做准备,一定早做准备,重要的事情说三遍,(大佬自动忽略)。算上零散的时间,我秋招准备时间就3个月左右,对于很多知识理解都不够深,所以只能拿到白菜价,很多公司都一面挂了。尽早明确方向,早做准备。
- 准备充分的尽量参加提前批,很多公司提前批是免笔试的,直接面试的,而且提前批sp的概率会更大;但是如果没准备好的话,可以提前批试试一些小公司或者不是特别想去的公司,一般都说提前批不影响正式批,但是会有面试记录的,如果提前批面的太差,后面可能不会捞了。
- 能内推就尽量内推,简历优秀的话还是有机会可以免笔试的,特别是能内推到特定部门的那种,多一次机会。内推信息在牛客上基本都能找到。
- 海投的话,利用好牛客网上的笔试日程和校招日程,注意deadline,自己最好记录一下投的哪些公司,安排好笔试时间,防止撞车。
- 心态调节,如果不是大佬,基本上都会有一段没有正向反馈的时间,我从8月1号开始投简历,笔试做了差不多20家,直到8.29号才收到第一家面试通知,那段时间也是一直否定自己,担心找不到工作;然后后面的面试很多都是一面挂了,自我安慰(反正我投的公司多,挂了这一家还有99家)
。
- 来碗鸡汤,坚持,秋招战线还是挺长的,干就完事了,大部分的公司都是9月份面试的,但是10月份也还是有挺多公司的,我10月份还是面了10多场面试,不要放弃。
- 后面有想到再补充吧~
学习路线:
学习路线方面的话,其实没有太多话语权,推荐一些我看过的大佬的帖子吧,我也是按照大佬们的路线来的。
刷题:
刷题的话可以看看这个博客,把剑指offer和LeetCode上的题目进行分类,面试的话,把这些刷完应该没什么问题了:
https://blog.csdn.net/kk55guang2/article/details/85223256
C++
如果基础不是很好的,可以去b站上搜黑马的视频看看,过一遍,对基础还是有帮助的。
大佬们的学习路线:
面经合集:
1.bigo:(offer,8.29一面,9.12二面,10.15三面)
一面:以前发过面经,传送门
二面(46min):
- 了解HTTP协议嘛,怎么对HTTP请求进行分片的。
- HTTP协议的弊端。了解私有协议嘛?
- 粘包,拆包问题怎么解决。(怎么判断数据包发送完毕)。
- 网络传输过程的大小端。
- hashmap底层实现。
- 双缓冲日志系统的实现,底层的数据结构的设计,了解nigix嘛,中间有类似的结构。
- epoll水平触发和边沿触发的区别。
- 图书馆管理系统数据表的设计,包含借书还书的功能,需要几个表,哪些是主键。
- python熟悉嘛?介绍一下python中的装饰器模型。
- 介绍实习,研究方向。
- 为什么没去做算法。
- 反问:后台的方向介绍。
三面(40min):
- 写一个9*9的均值滤波。
- 怎么去优化矩阵的计算速度。
- 1000万数中取出最大的100个数。
- 怎么把无限循环小数转化为分数形式。
- 介绍实习项目。
2. vivo(offer, 现场面9.17)
之前发过面经,传送门
3. 美团(四面挂,一面9.7,二面10.10,三面10.14,四面10.23)
一面:之前写过面经,传送门
二面:(转岗,55min)
- 自我介绍。
- 网络中的分层结构。TCP/IP协议在哪一层。
- TCP,UDP的差别。TCP怎么保证按序到达,怎么实现可靠传输;拥塞避免怎么实现的。
- 浏览器输入一个URL经过了哪些过程。MAC地址怎么处理的。
- HTTP中常见的code码。5XX的状态码用过哪些。
- HTTP和HTTPS的区别。HTTPS的怎么实现的。怎么实现加密的。加密算法。rsa和aes算法有什么区别。
- 左值和右值有什么区别,怎么把左值转化为右值。
- 进程和线程的区别,进程间的通信方式有哪些。
- 为什么线程的崩溃会导致这个进程的崩溃。
- 进程有哪些状态。一个进程从创建到运行经过哪些阶段。
- 静态库和动态库的差别?
- map的结构是怎样的。有哪些解决hash碰撞的方法。
- 怎么防止死锁,银行家算法,怎么预分配的。
- 用过哪些锁,互斥锁,条件变量,信号量,这些锁之间有什么差别。
- 自旋锁。
- 多线程编程要注意哪些方面?
- 实习项目介绍。
- 能不能来实习。拿了哪些offer,什么岗位?
- 算法题,Leetcode 121。时间复杂度和空间复杂度分析。
三面:(45min)
- 实习项目,主要负责那一块,印象最深刻的是哪一块。怎么优化的?
- 一面没有回答出来的问题,自旋锁?自旋锁的应用场景。
- 程序从点击到运行经过了哪些过程?
- 介绍虚函数?怎么用的?哪里会用到?虚函数的实现,虚表中存放的内容。
- C++实现一个单例模式。
- TCP和UDP的区别?
- IPv4地址不够怎么解决的。NAT,解释一下NAT的原理。NAT的过程。
- ping的原理,ping的过程。
- ping不通,说明服务器挂了?可能服务器有防火墙之类的?一直ping不通?
- 数据库索引,提高查询的速度,联合索引?
- 代码:二叉树的层序遍历。 Leetcode 102
- 职业规划?公司的期望,城市的要求?
四面:(主管面,55min)
- 职业的发展方向?
- 实习介绍。
- 找工作中比较看重什么?
- 是怎么看待客户端(前端)和后端的?
- 实习中的难点?怎么去解决的?和行业水平相比?出发点?
- 相比其他人的优势在哪里?
- 怎么去释放自己的压力的?
- 代码:实现矩阵顺时针输出。
- 判断3进制数的一个数是奇数还是偶数?
- 平时是怎么学习的?兴趣爱好?
4. 爱奇艺(三面挂,一面10.17,二面10.25,三面11.05)
一面:(45min)
- 自我介绍。
- new 和 malloc的区别?
- this指针的作用?
- const的作用?修饰成员函数的作用?
- 多态怎么实现的?虚函数会占用存储空间嘛?是占类的空间大小?
- C++中的四种类型转换?staic_cast转换?
static_cast, dynamic_cast, const_cast, reinterpreter_cast - 代码阅读: 一些字符指针的操作,判断结果?变量在内存中存储的位置?常量在内存中的生命周期?
- 多态的实现?
- python中的内置的数据结构,元组和字典的区别?
- is 和 == 的区别?
- 变量查找的过程?变量的作用范围?
- TCP中的连接状态有哪些?
- HTTP常用的方法?
- 进程间通信的方式有哪些?线程间的通信?
- 实习介绍。
二面:(35min)
- 为什么想来北京?
- 介绍实习。主要的难点?你做的什么工作?
- 项目介绍?one loop one thread思想?线程池怎么设置的?HTTP的方法?
- 双缓冲日志系统怎么实现的,有什么好处?
- ET和LT的区别?ET是怎么工作的?用for循环代替(读请求)?
- 怎么给一个对象分配指定地址空间的地址(内存分配)C++中如何在指定的内存中创建新对象?
- 重载和重写的区别?
- 类的构造函数中赋值和初始化列表有什么区别?初始化列表一般用在哪里?
- listen中backlog参数的含义?超过128会发生什么情况?
- HTTP2.0有哪些新特性?
- 进程间有哪些通信方式?
三面:(35min)
- 自我介绍:
- 实验室的项目。
- epoll的LT和ET模式的区别?
- 实习介绍。
- C++中的多态?动态绑定? 静态绑定?
- C++中的模板主要用在哪些地方?
- C++中的智能指针,weak_ptr中怎么处理内存泄露,错误的情况?
- 指针和引用的区别,用const修饰的区别?
- 介绍一下生产者消费者模型?
- 互斥量和条件变量的区别?条件变量的唤醒?
- 栈和队列的区别,两个栈模拟一个队列?
5. Zoom(offer,一面9.18,二面+HR 9.30)
一面(两个面试官,65min):
- 自我介绍。
- 项目相关,实习相关。
- 什么是Reactor?Reactor和Proactor的区别,为什么用Reactor? 同步和异步IO的区别。
- epoll怎么判断数据读取完毕?
- new 和 malloc的区别?有malloc了为什么还要设置new,new还有哪些用法?
- 为什么要设置虚析构函数?虚析构函数的作用。
- TCP 和 UDP的区别? 面向连接的连接的含义?
- private 有多态吗? 引用有多态吗?
- web 服务器的作用?(只能处理静态资源)服务器的处理流程?
- 日志系统的实现,为什么采用两块缓冲区,而不是把缓冲区的大小扩大。好处是什么。
- 日志来不及写,怎么处理。
- 线程池的处理逻辑,怎么判断一个线程挂掉,怎么实现负载均衡。
- 对智能指针的理解。
- 怎么处理失效和过期的请求。
- 如果没有空闲的工作线程,新到的请求怎么办?
- 怎么处理下载请求。下载的数据大小都不一致。怎么支持浏览器。
- 介绍一下对深度学习的理解。
二面(经理面, 30min):
- 实习和项目介绍。
- 多线程编程。
- 场景题:服务器开发需要优先考虑哪些方面。
6. 深信服(三面挂,现场两面9.20, 重新一面9.26)
一面(30min):
- 手撕代码:输出倒数第k个节点。
- 思路:马走棋盘,快排的过程,堆排序和hash。(时间复杂度)
- 链表删除节点。
- 多态,虚析构。
- C++中代码的存储区。
- epoll的两种触发方式的区别。
二面(30min):
- 段错误怎么解决。(生产环境中怎么解决)
- TCP头部有哪些字段。
- recevie返回值为0是什么情况。
- select的应用场景,有epoll了,select还有存在的价值吗?
- linux命令netstat, 查看cpu使用状态?
一面(重新被捞,电话面30min):
深信服的人才库是真.人才库,收到感谢信不到3天,都收到了新的面试通知,不过感觉像KPI面试。
- 自我介绍。
- 介绍一下大根堆和小根堆。它的应用场景。
- 排序算法了解哪些,快排的时间复杂度是多少,最坏的情况是怎么样的,空间复杂度是多少。
- 链表和数组,各自有哪些特点和区别。
- 介绍一下hash表。
- 结构体对齐:3个成员的结构体大小。
- 在main函数之前有哪些代码会先执行。
- 进程和线程的区别。
- 项目在进行多线程和多进程的编程时候,哪种场景适合用多线程,哪种适合用多进程。
- fork()函数的用法。怎么判断是父进程还是子进程。
- 进程间通信的手段和方式有哪些,项目中用过哪些。
- 调试手段有哪些,(GDB),GDB怎么去看多线程和多进程?GDB里面的命令,调试还有什么手段,如果一个服务器运行了n天,出现问题崩溃了,怎么去排查问题。
- 介绍一下I/O多路复用。
- 网络拥塞和TCP的拥塞控制机制:
- 浏览器访问一个URL的全过程:
- 什么是孤儿进程?
- 物理地址,线性地址,逻辑地址。
- 求单向链表的倒数第k个节点。
- 怎么判断单向链表有交叉。
- 巨大的没有排序的数组,如何快速找到它的中值。
- linux下用过哪些命令?
- 项目介绍:为啥要用Reactor模型?有哪些优势?服务器的应用场景是怎么样?
- C++中new和delete有什么区别?
- C++11的新特性。
- 拷贝构造和赋值运算符有什么区别?
- STL用法有哪些注意点?
- 如何设计一个地图功能,找到离当前位置最近的5个加油站。
7. cvte (二面挂,9.18现场两面)
之前发的面经,传送门
8.美图(offer,一面10.16,二面10.17)
一面(45min):
- 自我介绍。
- 虚函数实现原理?(虚表,虚指针)。非虚函数的访问是怎么样的?
- 怎么在c++中调用c语言的代码?(extern c)
- new和malloc的差别?
- map和unoreded_map的区别,如果把一个类传递给map的key值,需要加什么操作吗?
- redis,kafaka了解嘛?
- google的内存池(tcmalloc)了解嘛?内存池的实现?线程池的实现。
- 函数重载的底层实现原理?智能指针的实现原理,shared_ptr中有没有多次读的加锁机制?
- 遇到过内存泄露的情况嘛,内存泄露有哪些可能情况,怎么去解决内存泄露?
- 怎么去排查程序挂掉的情况?
- TCP的三次握手,TCP的四次挥手,为什么需要四次挥手(TCP是全双工的),TIME_WAIT的作用。
- TCP的窗口机制,拥塞避免算法。
- 浏览器打开一个网站经历了哪些过程?
- 场景题:A调用B的服务,B调用C的服务,C的服务最慢,怎么实现A的高性能的访问。
- 手撕:链表逆置。
二面(20min): 二面比较水
- 自我介绍
- 实习和项目介绍
- 职业规划
9.新东方在线(offer,一面9.20,二面10.11)
新东方的面试算是面过的比较水的了,当然最好也是给了一个劝退价。
一面(30min):
- 自我介绍。
- 实习和项目介绍。
- 介绍一下epoll的原理,有哪些触发模式。
- 进程和线程的区别。
- 进程间的通信和线程间的通信。
- TCP和UDP的区别,TCP为什么叫字节流。
- 数据库,主键,外键,索引。
- 用过哪些数据结构。
- 排序算法有哪些,介绍一下快排的思想。
- 手撕后序遍历,递归。
二面(20min):
- 自我介绍
- 实习和项目介绍
- 职业规划
- 聊人生
10.腾讯(一面挂,10.8)
本来都对腾讯不抱希望了,国庆节前被微信广告部捞了,国庆节复习了七天,最后还是挂了,还是太菜了。
一面:(70min)
- 自我介绍。
- 代码: 1.最长下降子序列,时间复杂度,和空间复杂度分析。
- 链表逆置
- 介绍一下Reactor模式。
- socket的API, socket, bind, listen。listen中backlog参数的意义,如果超过backlog之后的连接会怎么处理。
- 线程池怎么处理的,任务队列怎么实现的。怎么设置锁的。条件变量。(线程池的处理逻辑)
- 用过哪些锁,互斥锁,读写锁,信号量,条件变量,介绍一下自旋锁,自旋锁的应用场景。
- HTTP中头部的行数,头部的最大数量,请求头的最大行数。
- HTTP1.1的特性,KEEPALIVE, 管线化。
- 大端,小端字节序,为什么不统一,存在大小端的原因。
- 字节对齐的作用,这样做有什么好处。
- 1g的字符串赋值,需要多少时间,可以从汇编的角度思考。赋值操作主要的耗时在哪?
11. 字节(一面挂,一面9.11)
虽然一面挂了,但是字节的面试体验真的很好,全程都是和面试官在相互交流。
一面(60min):
- 自我介绍。
- 介绍实习。
- 研究方向介绍,介绍研究方向的场景。
- 介绍一下c++中内存泄露的情况。
- 怎么解决c++内存泄露,智能指针。
- 介绍一下智能指针(shared_ptr中循环引用),weak_ptr;智能指针出现内存泄露的情况。(智能指针的实现。)智能指针什么时候调用析构函数。
- 写程序的时候遇到过段错误吗?哪些情况可能引起段错误。有哪些手段可以去解决。
- 检查下面代码有错误没有。
- 冒泡排序的时间复杂度,快排的时间复杂度,简述一下快排的思想。
- 代码:求出最大连续子数组。
12.欢聚时代(一面挂,9.18)
现场面的,面试体验还是挺好的,面试官全程笑嘻嘻的,最后还是挂了,可能方向不是很符合。
一面(30min):
- 网络的时延和抖动。
- 怎么快速计算网络的带宽,上行速度。
- 什么是线程安全,怎么实现线程安全,有哪些方式。
- 线程中有哪些锁。
- 虚析构函数的作用。
- stl里面有哪些迭代器。
dns的算法实现,dns的流程。 - 智能指针。
- 实习相关。
13.华为(一面挂,9.19)
秋招面试体验最差的一次,没有之一,面试前排队排了两个多小时,进去面试感觉面试官想下班了,一直拖延时间,面完的时候,面试大厅感觉都没什么人了,直接就挂了。
一面(80min):
- 数组指针和指针数组的差别;
- 怎么用二叉树计算IP地址中的最长前缀。
- 编码安全。(浮点数的计算),段错误的产生,怎么保证编码安全。
- hash的原理,hashcode的计算方式(多项式)。
- C++中代码的存储区。
- 机试题复盘。
- 实习介绍和项目介绍。
- 手撕代码:单词翻转。去除中间的空格。
14.360(一面挂,9.2)
秋招面的比较早的公司了,面试体验很差,视频结束之后不到一分钟收到拒信。
可以参考之前发的面经,传送门。
15.广联达(一面挂,9.21)
现场面的,差点手撕红黑树,后面才知道原来面试官是TOP2大佬,前面面试的人就叫手撕红黑树了,orz。
一面(30min):
- C++多态:
- 红黑树和avl树的差别
- 用过哪些stl,map(红黑树), vector。
- 手撕中序遍历(递归和非递归)
- 阻塞IO和非阻塞IO。
- 线程池主要为了解决什么问题。
16.好未来(一面挂,9.22)
一面(30min):
- 自我介绍。
- 有没有对服务器进行过压测。支持多少并发,吞吐量,响应时间。(服务器的压测数据),为什么称为高并发。测试环境和配置。
- HTTP协议的实现,怎么解析的。这么判断一个数据包。HTTP数据包的格式。(请求头)
- HTTP中的状态码,301和302之间的区别。登陆的缓存。
- 线程池的作用,哪些情况下用线程池。线程池的实现的策略。请求太多,没有工作线程,怎么处理。线程池数量的设置,有没有什么依据。
- baklog有了解过嘛?
- epoll的原理,红黑树和就绪队列。epoll怎么判断请求已经就绪。
- 双缓冲区异步日志系统。怎么处理日志堆积的情况。(丢弃日志)设置的缓冲块的大小。这样设置的好处。
- 有没有看过一些开源的日志系统。日志的压测。
- 算法:找到部分有序数组中的顶峰元素。
17.追一科技 (一面挂,9.25)
一面(40min):
- 自我介绍。
- C++11新特性有哪些?weak_ptr指向的对象可不可以访问类的成员函数。weak_ptr转shared_ptr指针哪些情况下可能会失效。
- 能不能有虚构造函数,虚析构函数的作用。
4. 一个32位的Linux系统,64g内存,在c语言中最多可以申请一个多大的字符串。 - hashmap的设计与实现。
- 阻塞IO和非阻塞IO的区别,使用阻塞IO阻塞时,read会返回什么。
- 多个线程向日志线程写的情况,怎么处理。
- 算法题:找出0-100中出现2次的那个数字。 Leetcode 287
- 用通俗易懂的语言介绍一下反向传播算法。
18.富途(一面挂,9.28)
现场面的,面完的时候,面试官说我们想招的是有一点工作经验的(应届毕业生)。orz。
一面(30min):
- 笔试第二题,6个人中选四个人两两配对,有多少中可能性。
- 写代码: 16进制字符串转整型。int HextoDec(char *str)
- 在10个人中至少有2个人生日相同的概率(设一年为365天)。
10个人不同生日的概率:P0 = (365/365)(364/365)(363/365)(362/365)(361/365)(360/365)(359/365)(358/365)(357/365)(356/365)= 0.88310个人中,至少有2个人同一天生日的概率是:P1 = 1-P0 = 0.117... - 求两个字符串的交集。vectora ={"abc","def"} vectorb={"abc"}
- 异步缓冲日志系统。Reactor模式和Proactor模式的区别。
- TCP三次握手,为什么要有三次握手。
- listen(int fd, ) backlog的作用。
19.网易互娱(一面挂,10.18)
一面(65min):
- 自我介绍。
- 实习介绍
- 重写和重载的区别? 动态绑定?
- 代码阅读:多态的实现,虚函数表存放在哪里?
- 堆和栈的区别?代码的存储位置?
- 函数传值,const,传入参数和传出参数?
- map和unodered_map的差别? 红黑树?
- 有哪些解决哈希冲突的方法?
- 堆排序的过程?
- 手撕代码:树的镜像
- 数组中出现一半的数字?超过1/3的数字?(Leetcode)
- 爬楼梯(dp)
- 计算下一次出现毒圈的位置?(吃鸡战场)