深信服三轮面试 C++开发工程师
深信服一面
面试准备:
1、公司规模、行业和业务
8000人、网络安全、云计算、IT基础设施与物联网的产品和服务供应商
2、反问
(1)岗位职责
(2)岗位业务
(3)面试流程
面试复盘:
1、单链表反转
(1)第一个结点的next要置空!!!
(2)假如存在环,如何判断入环结点
快慢指针判断是否存在环,然后unordered_set记录环结点,
再重头遍历判断当前结点是否存在于unordered_set集合,第一个则为入环
2、给定长度为n的数组,随机抽取其中m个数
vector<int> arr = {···};
vector<int> ret;
int len = n;
int index;
for(int i = 0; i < m; ++i)
{
index = rand() % len;
--len;
ret.emplace_back(arr[index]);
swap(arr[index], arr[len]);
}
3、C++代码复用C代码
https://blog.csdn.net/lincoln_2012/article/details/50801080
extern“C”; //按C标准编译C代码(原因:C++支持重载,C不支持重载)
4、虚继承
http://c.biancheng.net/view/2280.html
为了解决多继承时的命名冲突和冗余数据问题,使得在派生类中只保留一份间接基类的成员(如菱形继承)。
最终派生类的构造函数必须要调用虚基类的构造函数。
在最终派生类的构造函数调用列表中,不管各个构造函数出现的顺序如何,编译器总是先调用虚基类的构造函数,再按照出现的顺序调用其他的构造函数。
(1)虚函数内存模型:编译时确定虚函数相对虚函数表首地址的偏移量
(2)虚继承内存模型:不懂?
5、TCP mss的作用
(1)MTU(最大传输单元):用来通知对方所能接受数据服务单元的最大尺寸,说明发送方能够接受的有效载荷大小。
是包或帧的最大长度,一般以字节记。如果MTU过大,在碰到路由器时会被拒绝转发,因为它不能处理过大的包。如果太小,因为协议一定要在包(或帧)上加上包头,那实际传送的数据量就会过小,这样也划不来。大部分操作系统会提供给用户一个默认值,该值一般对用户是比较合适的。
(2)MSS(最大报文长度):是TCP协议定义的一个选项,MSS选项用于在TCP连接建立时,收发双方协商通信时每一个报文段所能承载的最大数据长度。
一旦DF位置一,(DF位为1的话则不允许分片)将不允许中间设备对该报文进行分片,那么在遇到IP报文长度超过中间设备转发接口的MTU值时,该IP报文将会被中间设备丢弃。在丢弃后,中间设备会向发送方发送ICMP差错报文。
6、memcmp比较结构体是否一样?
判断两个结构体是否相等:重载操作符"=="
不能用函数memcpy来判断两个结构体是否相等:memcmp函数是逐个字节进行比较的,而struct存在字节对齐,字节对齐时补的字节内容是随机的,会产生垃圾值,所以无法比较。
7、1000万个域名,如何快速查找
怎么做呢?
8、B+树原理、作用,数据库查找原理
https://zhuanlan.zhihu.com/p/54084335
https://zhuanlan.zhihu.com/p/54102723
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
二叉查找树-> B树 -> B+树
(1)B树的由来:(多路平衡查找树)
数据库索引存储在磁盘,当数据量比较大的时候,索引的大小可能有几个G。当我们利用索引查询时,只能逐一加载每一个磁盘页(对于索引树的结点)。因为磁盘IO的速度远慢于内存交互,而且查找结点的最差时间复杂度取决于树高。所以将树从二叉查找树(瘦高)变成B树(矮胖)有利于加速查找。
(2)B+树相比B树的优势:
1)IO次数更少(因为中间结点不包含卫星数据,相同空间可存储更多索引)
2)查询性能稳定(每次查询必须查找到叶子结点)
3)范围查询简便(查询到范围的起始结点,然后直接链表遍历)
9、平衡二叉树的实现
这个有点复杂。。。
深信服二面
深信服HR面
面试复盘:
1,自我介绍
2,大学做过的项目
3,大学最印象深刻的事情
4,为什么选择就业而不是考研
5,实习的收获
6,为什么不从实习公司转正
7,根据简历问
8,查户口
9,反问
#深信服##面试题目#