总结了一下自己2020年参加春招(实习)和秋招的面试(语言是C++,岗位是后端研发)
关于学习经验的分享:经验
字节跳动
实习
一面
基本全程聊项目
- 什么是IO复用,什么是非阻塞IO
- TCP和UDP
- 流量控制解决了什么问题,怎么实现,接收窗口为0了怎么办
- 哈希表的作用,怎么解决哈希冲突
- 布隆过滤器原理作用
- redis的线程模型
- 项目结构
- 判定是否是镜像二叉树
二面
- 聊项目,reactor模型,线程模型
- epoll高效吗?为什么?什么情况高效
- LRU置换算法实现(说思路,不实现)
- http?无状态?无状态怎么实现用户登录?
- session,cookie,token
- csrf攻击,怎么防御
- linux进程空间分布
- 简单题(从一个棋盘的左上角走到右下角有多少种走法,只能向右和向下走)
三面
- 介绍项目。参考了什么开源代码吗?
- redis的数据结构,介绍一下set
- redis线程模型,为什么使用单线程?
- 说说内核态
- url访问网页的过程,用了哪些协议?
- 算法,不用乘除运算实现除法(一开始用减法,面试官让优化,位运算+递归实现)
- 算法,判断4张扑克牌是不是顺子,大小王可以作为任意牌
秋招
因为有个字节跳动的实习offer,但是之前因为某些原因没去成,提前批的时候直接被捞了参加终面。
- 聊了聊最近做的事情,讨论了一下raft算法的实现,和各种网络情况下出现的异常情况怎么处理,脑裂问题怎么解决。
- 了解快排吗?讲一讲快排的思路,实现一下单链表的快排。分析复杂度,递归层数,函数调用次数。
- 一个圆形的岛,你在岛中心,岛外有一只鲨鱼,它的速度是你的四倍,你需要在不被鲨鱼追上的情况下到达岛的边缘,说一说方案。能不能解析出你的运动路径。
- 反问。
参加了很多面试,还是感觉字节跳动的体验很好,面试官很友善,不断地引导问题,面试反馈也很亏,而且开启时间很早,6月就开始,有个offer心里不慌。
------------------------------分割线--------------------------------------
网易雷火
雷火的一二一起的,一面是做题
实习
一面 & 二面
做了一些基础题,记不太清了
算法题:一次攻击可以造成一点伤害或者两点伤害,要打死一只有n点血的怪物有多少种方式
二面
聊了聊项目,然后做了个题
在8×8的棋盘中有一只马(棋子,行走规则为走日字格)
马可以从出发点,行走63步之后走遍棋盘中的每一个点,请返回一个这样的可行路径(用了深度优先搜索的办法,面试官提了一个可以优化的点,就是搜索的时候调整一下每次跳跃的顺序)
三面
时间太久了也不记得了,都是一些比较基础的题,但是有一个题比较有意思
即父类的虚函数定义了一个默认形参,子类对这个虚函数进行override的时候,设置了一个新的默认形
参,那么在使用父类指针调用子类虚函数时,使用的默认形参是哪一个?(effective C++上有讲过,答案是会调用子类的函数,但是默认参数是父类的,有点离谱)
秋招
一二面是一起的
一面
- 做题(填空),判断i++和++i的输出
- 做题(多选),下列哪些是在编译期间完成计算的(#define,const int a,sizeof(void*),模板)
- 做题(单选),fin_wait1状态是什么时候出现的,讲一讲TCP状态转移图
- TCP和UDP的区别,拥塞控制说一说
- 做题(多选),下列关于epoll,poll,select正确的是(epoll定时器精度最高,poll没有监听数量的限制,select可移植性更好,select监听的套接字在内核态保存)
- 讲了一下raft算法
- 讲一讲虚拟继承
- 讲一讲RTTI
- dynamic_cast的用法,无法转换时会出现什么情况(指针返会NULL,引用抛异常)
二面
- 聊项目
- 用户态和内核态,为什么要这么区分
- 系统调用的过程
- 向一个对端关闭的TCP套接字写数据会出现什么情况(RST和sigpipe)
- 菱形继承的内存模型,虚拟继承后会怎么样
- 算法题,在文件里面有n个在[1,n]之间各不相同的数字,挖去其中两个,找到这两个数字。要求可以多次读文件获取文件中的信息,但是仅允许使用O(1)的内存空间
三面
- 聊项目
- 了解printf的可变参数是怎么实现的吗,从汇编层面解释一下(卒,不懂汇编)
- 使用过__stdcall吗(卒,压根没见过)
- 计算结构体大小
- program pack之后结构体的大小,这个指令有什么好处,用在什么地方,有什么坏处
- 空类会默认生成哪些(构造,析构,拷贝,operator=),面试官说还有其他的,想不到了
- 写了一段代码问输出结果(主要是考继承中调用虚函数到底调用哪一个,虚函数的默认参数绑定的又是哪一个,这个实习问过啦,哈哈哈哈)
- 求第K大的数的两种办法和时间复杂度
- 哈希表的线性探测法怎么删除数据
------------------------------分割线--------------------------------------
虎牙
实习
一面
- 聊项目,用了muduo,比较详细问了实现细节
- extern 作用,为什么要extern C,extern变量在哪个数据段
- 数组和链表的区别
- map实现,为什么不用AVL树
- B+树有什么用?为什么不能用红黑树
- unordered_map
- 怎么实现游戏中的排行榜(没想到,感觉游戏里面的排行榜不是实时的)
- ++i线程安全吗,为什么
- LRU是什么,有什么用,怎么实现
- 协程和线程的区别
二面:
- 聊天项目 (muduo库相关的),了解协程吗,有用过吗
- 红黑树和链表的使用场景
- vector和deque的使用场景(只需要pushback的时候,两者谁的速度快)
- vector扩容和realloc是需要直接拷贝吗?
- TCP和UDP
- UDP的使用场景(听过P2P和HTTPDNS吗,没有。后面了解了一下P2P需要穿透内网,UDP应该更容易实现)
- 场景题:一条弹幕有1-30个字,需要对弹幕做一个敏感词检测,现在词库里面又100万个敏感词,怎
么进行检测(没什么特别好的想法,考虑布隆过滤器,有小伙伴有比较好的想法可以说一下)
秋招
投了没捞简历
------------------------------分割线--------------------------------------
钉钉
钉钉只有春招面过,阿里各部门的春招会在校招系统开启之前就进行,这时候可以参加多个部门的面试,但是一旦校招系统开启了,最终只能选择一个部门参加。
实习
一面
- 四种cast,dynamiccast的实现方式,变量的类型信息存在哪儿?
- const的用法
- const和define的区别
- 怎么实现可靠UDP
- TCP怎么确认报文
- 数组链表map一笔带过。讲一讲特点
- 什么时候可靠UDP会比TCP更好用
- UDP最大报文长度,怎么称呼这个数据(MSS?)
- 智能指针及其实现(operator=重载有什么注意事项)
- 聊项目,多线程编程,coredump怎么debug
- 怎么检查内存泄漏
- 内存碎片怎么处理,用过tcmalloc吗(没听过。。后面查了一下是更适用于多线程的一个malloc库)
- 了解互斥锁的底层实现吗?(被问自闭了)原子变量呢,能不能猜一下?
- 集群怎么负载均衡(一致性哈希,虚拟节点)
- 了解设计模式吗(不了解)
- 算法题 leetcode15题
二面
- 乐观锁悲观锁的区别
- 一个线程修改某个变量,静一个线程一定可以过得这个变量的最新值吗?(volatile关键字)
- linux系统中进程线程的区别(聊到了cow机制,redis的持久化过程)
- 一致性哈希
后面是两个场景题
- 王者荣耀游戏,你控制人物从队友身边跑过去,你队友的手机也能看到你从身边跑过去,请问这个过程客户端和服务器做了什么
- 微信,附近的人这个功能怎么实现(怎么判断大量的点是否在给定点的附近?空间索引)
后面参加阿里云的面试就没有继续面试钉钉的
------------------------------分割线--------------------------------------
阿里云
实习
一面:
- EPOLL和POLL,性能比较
- 有没有试过把服务器放到高性能服务器上,绑核过后跑一下
- 实现的线程池有状态吗?(面试官说java线程池就是有状态的,但是我不了解)
- TCP粘包
- 网络数据到用户层经过了几次拷贝(猜的,两次,一次网卡到内核,一次内核到用户态。后面查了一下,错了,应该是三次)
- 对内核有了解吗?(没有)
- 智能指针的原理(RAII封装+引用计数)
- 野指针,怎么避免野指针?
- 多进程可以监听同一个端口吗?会出现什么问题(惊群)?怎么解决?多线程可以监听同一个端口吗(可以)?
- C++11和GNU11的区别吗?(不了解)
- vector clear的实现原理
- 虚函数和纯虚函数?虚函数可以内联吗?没有被继承的类有虚函数可以内联吗(说了不可以,但是面试官说可以)?
- malloc和new的区别
- 32位主机上可以malloc申请128G空间吗?(不可以)那最多可以malloc多大的空间(2个多G)?
- 除了系统调用用户态和内核态交互的手段(不知道)
二面:
- 聊项目,你的服务器怎么做负载均衡
场景:比如浏览器访问一个http服务器,会同时向这个服务器发起多个TCP连接,这些连接中有的在IO图片,有的在IO文字,负载肯定是不同的,怎么负载均衡(额。答不上,感觉可以参考work steal那种策略?) - 怎么优化服务器的IO操作,IO的时候考虑磁盘的特点,HDD,SSD?(答不上,听蒙蔽了)
- 继续聊项目。心跳连接正常就可以保证服务器活着吗?怎样的心跳才能保证服务器一定活着?
- 你觉得多线程编程比较难的问题?(面试官补充了,多线程间任务不要交叉,架构要合理)
- 多线程编程时怎么避免死锁?
- 协程的理解?协程编程的注意事项?协程里面想要实现sleep怎么做?
- 手撕LRU(双向链表+哈希表)
三面:
- 二叉树用过吗?有哪些遍历算法(前后中层序)?非递归用啥实现(队列和栈)?递归和非递归的区别?
- 海量数据的全排使用什么算法?(STL排序算法,快排+堆排+插入排序)
- topK问题一般用什么数据结构(堆,partition)
- C++重载怎么实现?(编译时编译成为不同的符号名字)
- 虚函数实现(详细:虚表,虚表指针,怎么调用)
- 局部变量,全局变量,静态变量的分区
- 协程里面能用互斥锁吗?
- 互斥锁,自旋锁,读写锁的区别(详细聊,跟内核态连起来聊)
后面两面就是做题了,具体题目记不住了,有一个题目是写一个线程池(用任务队列+条件变量和锁来实现吧)
秋招
因为拿了实习offer没去,秋招直接终面,基本没怎么问技术特别相关的问题。
------------------------------分割线--------------------------------------
下面的一些公司就只参加了秋招了
百度
一面
- 聊项目,大概半个小时。问得很多很细,各种场景题
- 你这样设计的reactor模型(多线程多eventloop)和多线程单eventloop的reactor有啥区别吗
- 场景题,哪些业务适合长连接,哪些适合短链接(根据业务,负载,场景去考虑。都想不出来)
- 场景题,你做爬虫,爬取其他网站的数据需要考虑哪些,怎么解决(get不到面试官的点,想到啥就说啥,感觉可以考虑分布式的设计,mapreduce,布隆过滤器等)
- HTTP头中有哪些你认为关键的字段(说了几个记得住的)
- C++11说说你熟悉的新特性
- 讲讲你觉得分布式的难点(一致性问题和网络的不可靠)
- 那么redis是怎么保证一致性的(不能保证一致性,比如redis集群的分布式锁是可能会丢失的)
- redis单线程为什么高效?又聊到了项目的reactor模型。。。。。
- 线程同步手段,分析性能,场景(终于整点儿正常题目了)
- 常用的STL容器,map和unordered_map,分析性能和优缺点
- 写题,简单,反转单词, 输入hello world!,输出world! hello
二面
- 聊项目,详细的聊
- 详细问了项目的内存管理
- 大并发量的项目,内存管理应该注意哪些点?(答了内存池,好的内存池能够减少内存碎片,减少内存分配的锁开销,可以用tcmalloc举例子)
- 两条单链表判断是否相交,链表可能有环,没做出来
- 手写前序遍历
- 场景题,怎么实现一个压力测试的小程序(两个功能,一个是读取数据库中的请求数据,一个是按照给定QPS均匀发起请求)
三面
- 聊项目,一直介绍,从想法,到实践
- 讲一讲你研究生期间的整体的学习进展
- 你对百度这个公司的看法怎么样(讲了一下百度是一个很有技术的公司)
- 你为什么这么觉得(送命题,讲了百度的BRPC)
- 你觉得BRPC有什么优势(卒)
- 你选择公司的标准
- 你还有什么想问的吗?
------------------------------分割线--------------------------------------
腾讯云
8-13
一面
聊了35分钟项目
2分钟C++11新特性
1分钟算法题(最长回文子串,想问马拉车算法,不会)
反问
二面
- 讲一讲raft和paxos算法
- 简单的讲一讲他们在日志不同的情况下的处理方式,这么处理为什么是安全的?
- 讲一讲leveldb的原理
- 设计一个数据结构,有100个用户看视频,一共100个视频,统计每个视频的播放量(用一个map存)
- 现在是一百个用户,一亿个视频,怎么处理。(答不上,下来查了一下应该是hyperLoglog)
- 知道IO的过程吗,一次IO用到了哪些内核结构(人懵逼了)
- 进程和线程你肯定知道,那你知道协程的原理吗?
- 进程调度的时候用了哪些数据结构(我想说CFS的红黑树,但是老哥说不对,他说是一个XXXX的梯度队列,懵逼。。。完全听不懂)
- 你有什么想问我的
被面试官吊打,但是离谱的是后面还给过了
------------------------------分割线--------------------------------------
猿辅导
一面
- 介绍项目
- 项目中实现了raft算法,讲一下
- leader下线后会怎么处理
- 旧的leader重新上线后会出现什么情况
- 选主和复制需要注意些什么
- 你看过leveldb的源码,介绍一下
- sstable是怎么存储数据和索引数据的(从sstable讲到block内部的数据存放,简单的说就是建立稀疏索引,索引即数据,也存在sstable里面)
- memtable是怎样的结构(跳表)
- 除了索引leveldb怎么加速数据的查询(布隆过滤器,不断地compact)
- level0和其他level有什么区别(是否存在overlap)
- 算法题:找到二叉树中最大的一层子节点个数是多少
二面
- 进程线程的区别(老生常谈了)
- 进程调度算法(CFS)
- HTTP1.0 2.0 3.0的区别,演进的思路,主要想解决什么问题
- 你不了解QUIC协议,那么让你实现可靠的UDP应该怎么做(QUIC是真不了解,只能照着TCP的实现来抄一套)
- 算法题,TopK,不能用现成的堆(快速选择,或者自己实现一个堆)
- 算法题,连续子串的最大乘积
三面
- 闲聊,问了毕设的内容
- 写题,BST topk问题
- 写题,两个线程按序打印数组,一个线程只打印奇数,一个线程只打印偶数
- 编译链接的过程
- 编译器可能对代码做哪些优化(指令重排,CPU流水线)
- 模板在哪个编译阶段展开
- 动态库静态库的优缺点
- 编译器怎么删除不会执行到的无用代码段
- 内联函数有啥用
- 虚函数可以内联吗
------------------------------分割线--------------------------------------
快手
一面
- 聊项目
- 实现LRU,不能用list,要求自己写一个双向链表
二面
聊项目,怎么对项目进行优化
聊raft的实现和工程上可以做的优化
- 读数据可以不走raft直接从主节点读吗?(readIndex算法)
- 如果直接从主机读数据,那么脑裂了怎么办?(旧的主机不知道自己已经被抛弃了,还在提供读取服务)
- 解决脑裂
- 怎么判断哪些数据的读取应该走raft,哪些数据直接从主节点上读?
- 论文上讲过一个连续切主时候对日志提交的处理,能不能优化
做题,写出一个数字n的所有因子序列(不重复,且不包含1和本身),假如输入8,应该输出222,24
三面
- 聊项目及其优化
- 说一说HTTP2.0解决了什么问题,有哪些优化
- 了解QUIC吗,HTTP的演进解决了哪些问题
- 说一说linux内存管理
- 了解swap区吗
- 说一说linux的伙伴系统,解决了什么问题
- 说一说协程的原理
- 协程切换的时候要保存哪些数据,是所有的CPU寄存器值都需要压栈吗?
- 协程栈的管理有哪些方法
- 共享栈的会导致切换的时候有两次拷贝,有更好的方法吗。
后面有一个快Star的加面,基本没有问技术的问题。
全部评论
(7) 回帖