腾讯C++后台开发实习面经
一面:
腾讯会议,开视频,屏幕共享。面试官很温和的一个人,善于引导,面试体验很好。
数据结构:
面试是层层递进的,从一个问题一直往下引申。
链表
1.先介绍一下链表吧
链表分为单链表,双向链表,循环链表等等。提到了哑节点常用操作等等。
2.链表有哪些应用
回答了LRU、list源码就是链表,又说二叉树的左右指针可以看作特殊的链表,二者可以相互转换。
然后追问还有吗?
没想出来,提醒:约瑟夫环。
3.给一个无序链表,如何排序?
我说让我的话我用归并。
4.链表归并如何实现?
讲了一下,首先取中点分成两半....
然后追问,如何找中点?答:快慢指针及其如何实现
5.链表归并的时间复杂度
6.你排序之后,如何查找一个链表特定的值?
我说只能顺序查找,从头遍历,时间复杂度是O(N),然后我有说,这样太慢了,实际的话我可以用一颗红黑树把这些节点关联起来,如果需要顺序遍历就用链表方式,如果需要查特定的值,就用红黑树。
7.如何改进
面试官说,我接下来正要说如何改进,用红黑树当然可以,如果就是用链表呢?
我思考了好几秒,突然想到了->跳跃表
8.链表存储的值占用8字节,那么链表的空间利用率是多少?
我开始回答的是内存对齐问题和内存碎片问题,没回答到点子上。这个刚开始没弄明白,后来想,空间利用率就是元素的空间利用率,那么不光元素要占空间,指针也占空间。然后回答32位系统,指针占4字节,那么空间利用率是2/3,64位系统1/2。应该是对的。
好了,链表的连环提问告一段落。
哈希表
1.哈希表你如何设计?
2.解决冲突如何解决
开链法和再哈希法
3.哈希扩容如何设计?
准备两个数组,一个备用,扩容涉及到的各种问题,如何可以成功扩容,没空间会怎样,转移再哈希时要查数据时怎么弄等等,分类讨论.......
Redis的数据结构
有一堆key-values,用什么数据结构找出比如值是在区间3-5的所有key-values
我回答的可以用前缀树...这个虽然可以,但redis中用的是跳跃表。恍然大悟...
C++
我看你技术栈是C++,那就问几个C++的问题吧。
问了好几个,比较简单就忘了
1.虚函数
2.纯虚函数
3.派生类了如果继承了一个有虚函数的基类,sizeof一下是多大?继承了两个呢?
4.你是如何检查内存泄漏的?
这个回答的不好,有大佬帮忙解答吗?之前网上找的,并没有找到满意的答案。
我回答的可以用valgrind检查,还说了一下用智能指针等RAII机制防止内存泄漏。
5. 然后又问,你程序中就是用裸指针呢?有很多的类要用,怎么办?
我说new/delete成对用啥的...
面试官提醒:可以用个计数器?这问题不会...
操作系统
问啥忘记了计算机网络
1.三次握手
2.第二次握手回复丢失会怎样
3.第三次握手丢失会怎样
4.介绍拥塞控制的慢启动过程
5.刚开始时拥塞窗口多大
6.慢启动什么时候结束,标志是啥?
7.慢启动的阈值如何确定的?
(第二次握手的时候协商的)这里没准备到
8.拥塞避免,阈值多大,怎么确定的。后续的阶段是怎样的?
9.poll和epoll区别
其他
1. #define和typedef的区别
2. 空类sizeof一下是多大?只有一个虚析构函数的类呢?
3.说一下后序遍历和中序遍历
算法题
1.用shell检测一个后台程序是否启动,没启动就输出警告并启动
这题不会..
2.字符串找里面有没有相同的字符
用哈希表做的
3.实现atoi,字符串转整数
要考虑多种情况
二面:
根据项目引申出来的问题,问的很多跟Linux操作有关。
- 介绍一下项目
- LT和ET模式的区别,在程序中怎么实现,吞吐量分别是多少?ET为什么效率高?服务器出bug了用的什么调试工具调试的?
- 你的项目遇到的棘手的问题,怎么解决的。
- cpu利用率怎么查看?我说用top,top有哪些字段?
- 磁盘利用率和性能如何查看?
- linux中open 和fopen的区别
- 系统调用和C库函数的区别
- http返回码5开头的含义,4开头的含义
- static修饰变量和函数的区别
- 出了一道算法题:给一堆二维坐标点,如何判断最大共线的点数
这些问题都能回答出一点来,但感觉回答的不好,本来以为要挂了...但过会就又发来新的面试链接,后面就是hr面了