腾讯日常实习一面面经,坐标深圳
2020/10/21/22:00
电话面试,突然打过来的
首先简单的自我介绍
进入正题
c++篇
1、vector底层是怎么实现的?
- vector是连续存储的容器,动态数组,堆上分配空间;如果有剩余空间,则直接添加到最后;如果没有剩余空间,则重新开辟一块原有大小两倍的空间,将原来空间的内容复制初始化新空间,然后析构释放掉原空间;适用于经常随机访问且不经常对尾节点进行插入删除。
2、说一下vector中删除大于等于5的元素
- 直接遍历,找到大于5的元素删除,用erase函数。
3、map底层怎么实现的,复杂度是多少?
- 底层是用红黑树实现的,插入删除复杂度为O(log n)。
4、什么是虚函数表?
- 每个包含虚函数的类都包含一个虚函数表;虚函数表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。
5、虚函数表和虚函数表指针是如何实现动态绑定的?
- 编译器在每个类中添加了一个指针用来指向虚函数表,在类的对象的前4个字节;程序在执行时,根据虚函数表指针来访问对象对应的虚函数表,然后在虚函数表中查找所调用函数对应的条目,最后根据虚函数表找到函数指针,调用函数。
6、A类的空指针指向A的成员函数会发生什么事情?
- 不访问对象的成员变量,则程序运行正常,即函数没有用到隐式的this指针,调用成员变量则程序崩溃。虚函数由于虚函数表指针的存在也不可调用。
7、C++11有哪些新特性?
-
auto关键字
编译器可以根据初始值自动推导出类型。但是不能用于函数传参以及数组类型的推导;
-
nullptr关键字
nullptr是一种特殊类型的字面值,它可以被转换成任意其它的指针类型;而NULL一般被宏定义为0,在遇到重载时可能会出现问题;
-
智能指针
C++11新增了std::shared_ptr、std::weak_ptr等类型的智能指针,用于解决内存管理的问题;
-
初始化列表
使用初始化列表来对类进行初始化;
-
右值引用
基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率;
-
atomic原子操作用于多线程资源互斥操作;
-
新增STL容器array以及tuple。
8、说一下左值右值
-
左值和右值的概念:
左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象;
右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象;
-
右值引用和左值引用的区别:
左值可以寻址,而右值不可以;
左值可以被赋值,右值不可以被赋值,可以用来给左值赋值;
左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通过成员函数改变)。
操作系统篇
9、说一下epoll
- 一种高效监听多个socket的方法,是select和poll的改进版本。相对于select和poll来说,epoll更加灵活,没有描述符限制;
- epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的拷贝只需一次;
- epoll仅通过回调函数对活跃的socket操作;
- epoll的三个接口:1、int epoll_create(int size);2、int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);3、int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
- 有ET和LT两种工作模式。
10、select什么时候优于epoll?
- 一般认为如果在并发量低,socket都比较活跃的情况下,select效率更高,也就是说活跃socket数目与监控的总的socket数目之比越大,select效率越高,因为select反正都会遍历所有的socket,如果比例大,就没有白白遍历。加之于select本身实现比较简单,导致总体现象比epoll好。
11、说一说Linux常见命令
- 这个随便说一说
12、如何查看占用资源最多的进程
- top然后P(根据cpu占用百分比排序,注意大写)。
计算机网络篇
13、有没有抓过包?
- 木有
14、为什么要三次握手?
- 为了防止已经失效的连接请求报文突然又传输到服务器端导致服务器资源的浪费。
15、如果没有第三次握手会发生什么事情?
- 如果没有第三次握手,由于服务器端发送了确认应答信息,则表示新的连接建立成功,但是客户端并没有向服务器端发送任何建立请求,客户端将忽略服务器端的确认报文,更不会发送任何请求或数据。而服务器端认为建立成功了,并一直在等待建立连接,直到超出计数器的设定值,则认为服务器端出现了异常,并关闭此链接。这个等待的过程中,浪费了服务器端的资源。
16、知不知道TIME-WAIT状态?
- TIME-WAIT状态是客户端和服务器端关闭socket请求时,主动断开方发送完最后一次ACK之后进入的状态,持续时间为2msl。
17、如果TIME-WAIT没有等待2msl会发生什么事情?
- 如果没有等待2msl,ACK报文可能丢失,主动断开方就无法收到重传的FIN+ACK,被动断开方无法按照正常步骤进入CLOSED状态。
18、如果没有TIME-WAIT客户端再次连接的时候会发生什么事情?服务器会怎么样?
- 不会,求指点QAQ
算法篇
19、找链表倒数第k个节点
- 双指针法,p1在头节点,p2在第k个节点,同时往前走,p2到尾节点的时候p1到倒数第k个节点。
20、找链表中是否有环
- 双指针法,p1走一步p2走两步,相遇则有环。
21、找出数组当中出现次数大于数组长度一半的数
- unordered_map记录保存;
- 这个数字出现的次数超过数组长度的一半,那么这个数字一定是中位数。利用快速排序法,经过一轮排序后小于该数字的元素位于其左边,大于它的在它的右边,此时判断该数字的位置是不是数组的中间位置,如果是则返回;如果该数字的位置大于数组中间位置,则说明中位数在它的左边,否则在右边。递归下去就可以找到了。
项目篇
22、挑一个项目,讲讲你遇到的最难的问题是什么?如何解决的?要凸显你的工作量和难点的价值。*
总结
- c++着重考察了虚函数、虚函数表和STL的相关问题,要了解各种常见容器的底层实现以及使用方法;
- 面试官对我说计算机网络里面TCP/IP的细节弄清楚了很加分,可惜都没有回答上来,要好好研究为什么要第三次握手以及TIME-WAIT的影响;
- 算法部分没有过多的考察,个人感觉还是靠刷题吧;
- 项目上回答的不够好,希望着重凸显难点和工作量(很加分),这个问题需要好好准备一下;
- 面试官小哥哥很温柔,体验了一次来自腾讯爸爸的爱;
- 晚上十点面试,一个小时才结束,是不是在暗示企业文化?(狗头)
求指教!!!