【2023网易雷火服务器开发日常实习面经】
2023年暑期
网易一面面经
-
自我介绍
-
项目介绍(问的挺深的)
-
进程地址空间(第二次面试的时候已经写过了)
-
智能指针(智能指针我是从异常开始说起,以及RAII,还有各种智能指针的原理,其中不乏一些场景题,回答了很久)
【C++修炼之路】32.智能指针-CSDN博客
-
信号(应该有)
-
哈希等等
其他的想不起来了,快四个月了。
最后没让我写算法题,有点庆幸。一面面试官变成了后来的jw师兄。
网易二面面经
这里面试的就是我现在的主管了,二面我记得算是比较清楚,表现我也觉得还行。
首先肯定还是自我介绍+项目,期间问了哈希是什么。
数据库问的蛮多的。
其次就是数据库的事务,什么是事务?
我:其实每个事务都算是一个SQL语句的扩展,每一个SQL语句也都是一个事务的压缩,由于存在各种隔离级别,SQL语句有着默认的隔离级别,所以 不设置时不需要commit;而事务作为一条SQL的扩展,其中间隔着许多步骤,因此在哪一个步骤下commit都会有不一样的结果,这些不一样的结果就一一对应着事务的四个隔离级别:
读未提交、读提交、可重复读、串行化。其中也会存在各种形式的错误情况,有的错误也不算错误:脏读、不可重复读、幻读、加锁读。
还问了数据库索引,聚簇,非聚簇,主键,唯一键,普通,全文。
数据库引擎:InnoDB,MYISAM
其中问了B+树的聚簇非聚簇的区别,如何查找能不能直接在单独的表里查找,挺多问题的。只记得当时回答的还可以。
主管:知道快照吗?
我:知道。
主管:快照用的是什么数据结构呢。
我:我认为快照作为查找之前的一条条语句,应该是用链表串联起来的。
然后问,知道红黑树吗?
我:知道,之前也写过。
那来说说是怎么做的吧?
我:红黑树为了维持相对的平衡就会在插入节点时进行相应的旋转来尽量减少树的高度,但实际上相比于AVL树并没有要求绝对的平衡,正如名字一样,红黑树的节点有两种颜色即红色和黑色,如果一个节点是红色的,则它的两个孩子结点是黑色的;对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。如果我们新插入的结点的颜色为黑的话,插入之后一定会打破上述第二个结构,导致每条路径的黑结点数量不同;如果新插入的节点的颜色为红色的话,也有可能不满足情况,如果插入节点的父节点为黑的话还好,但如果父节点为红,也就不满足这个条件了。因此,插入节点的颜色尤为重要,经过上述考虑,插入节点的颜色为红无疑是最好的选择,因为有可能满足条件,有可能不满足条件,但插入黑色一定不满足。如果插入红色的也不满足,那就后期处理就好了。
接下来就是C++了,问了我C++类型转换都有什么,我说我只用过static_cast,其他的没用过,也没有背过八股。C++应该还问了别的,没印象了。
主管:知道STL吗?
我:知道,是要我说一下具体的吗
主管:那来讲一下STL。其实这里也是自由发挥了。
我:STL中实际上都是一些便于C++操作的东西,vector、list、deque、set、map、unordered_set、unordered_map等等,其中的底层结构我也看过,并且实现过:
比如vector,为了满足各种参数的数量和类型的不同,其中的构造函数重载了很多种,比如无参构造,拷贝构造,构造并初始化n个val。
vector肯定存在扩容,与C语言中realloc扩容的原理感觉是一样的,都存在原地扩容与异地扩容的情况,空间小就原地扩,空间大就异地扩。但由于在设计时vector内部无法知道是原地扩容还是异地扩容,那么就只能把他看成异地扩容,实现的时候必须要把扩容的偏移量记成tmp,在扩容的时候由于异地扩容指针会发生变化指向一个新的位置,那么此时的容量就通过加上tmp来得到,vector扩容机制我觉得就是这么一个过程。其次vector在拷贝的时候也会存在问题,深拷贝/浅拷贝,这里的原理大家想知道就搜一下吧,或者看这个,由于说起来挺麻烦的:【C++修炼之路】10. vector类_每天都要进步呀~的博客-CSDN博客实际上就是vector迭代器失效。
我:我还可以接着说吗?
主管:你继续。
说完vector之后,我紧接着说list的底层,其中,我说list的迭代器有正向的,反向的,const的,非const的,那么在设计时,相对于vector的直接加上const,list其与vector对比,对于const的list迭代器来说,因为本身是以类的方式进行,而const实际上就代表迭代器指向的内容不可改变,也就是说只需要改变普通迭代器的解引用运算符重载就可以了,因此我们实现const有两种思路可行,一是再写一个类,只将普通迭代器运算符重载的函数换成const类型,也就是这样:多加了一个const类型的迭代器的类,但是我们会发现,他们二者之间的区别只有在解引用的时候返回的类型是不同的,那么此时就相当于除了解引用,其他的都是重复的,这样就造成了大量的代码冗余,那么不如就直接在模板多加上一个类型比如Ptr,一个非const的解引用用Ref代替,一个const的解引用用Ptr代替,表示一个可修改,一个不可修改…
也提了一下deque中控器的实现,不过由于时间原因也没怎么说了。
主管:你知道栈为什么是这种结构吗?
我:这个实际上,我觉得按照我的理解,您提的问题有点本末倒置了,我认为就是由于这种结构,才将其命名为栈。
后来查了一下,还真有回答上这种问题的。不管对不对,就是嘴硬,反正答上了。
主管:python了解吗?
我:会一点语法。
主管:平时怎么学习的?
我:一般就是写博客,然后有个记忆的过程,大一的时候不知道该学什么,只知道C语言,就把C语言学了三遍。比如什么指针数组,数组指针,函数指针,函数指针数组,指向函数指针数组的指针等等这些理解的都比较深刻。
仍然没有考我算法题。
我:不会还有三面吧?
主管:没有了。
后来谈了一些其他的,没什么印象了,也不是面试的东西了。
—2023.12.15