腾讯字节暑期C++后台开发实习面经
项目相关的问题就暂时隐去了,毕竟没有参考性。一些问题给出了自己稚嫩的回答,但不保证是正确的回答,建议使用markdown复制阅读,这样看大纲就可以忽略烦人的辣鸡个人答案了。第一次发面经,如有违规,私信我然后会进行修改或删除。祝大家找到好的实习的工作。
腾讯一面二面三面
一面(3.31)
1.项目,问这个主要干了啥,不用说细节
个人答案:
2.Linux指令怎么查看占用内存情况,怎么查看占用端口情况
个人答案:
- top
- lsof
3.一个数组a[20][10]的首地址是100,问a[11][5]的地址是多少
个人答案:
- (100+4*(11*10+5))
- a[0][0] a[0][1] .....a[0][9] a[1][0] a[1][1]...
4.数组和链表的内存存储和插入
个人答案:
- 数组连续;链表不连续。
- 数组插入需要移位,空间不够需要扩容;链表直接插入即可。
5.unordered_map和map的底层实现,以及使用场景如何选择
个人答案:
- Unordered_map为哈希表;map为红黑树。
- 如果键值需要有序则用map;其他用unordered_map
6.#include时“”和<>的区别
个人答案:
- ""先在项目找,再去全盘找。
- <>先在库文件找,再去项目找。
- <>不能找的自己定义的;""可以找到。
参考答案:
- #include<>:编译器直接从系统类库目录里查找头文件:
- #include"":默认从项目当前目录查找头文件,所谓项目当前目录,就是项目工程文件(.vcxproj)所在的目录。如果在项目当前目录下查找失败,再从项目配置的头文件引用目录查找头文件,所谓项目配置的引用目录,就是我们在项目工程中设置的头文件引用目录。如果项目配置的头文件引用目录中仍然查找失败,再从系统类库目录里查找头文件
7.vector增加元素时,内存变化情况以及push_back使用的是指针、引用还是拷贝
个人答案:
- 主要看size和capacity,如果capacity不够需要重新分配内存。(扩容大小忘了)
- Push_back使用的是拷贝,类的话也是使用拷贝。
8.TCP/UDP的区别
个人答案:
- TCP是可靠的;UDP是不可靠的。
- TCP是基于连接的;UDP只管发送,不管对方收不收得到。
9.TCP可靠是怎么保证
个人答案:
- 基于连接
- 拥塞控制
10.进程间通信方法
个人答案:
- 管道
- 共享内存
- 信号
- 信号量
- socket
11.socket相对于另外几个的优点
个人答案:
- socket可以用在不同机器之间的进程间通信
12.计算机内存只有1M,有一个文件1G,怎么排序
个人答案:
- 归并:先每一个1M文件进行排序,然后对这一1024个文件进行合并。
13.不用pow实现计算m的n次幂,时间复杂度
个人答案:
-
快速幂
-
举例:4的7次方计算方法:
- 7的二进制为0111
- 则对应的乘法为4^4 * 4^2 * 4^1
-
时间复杂度O(log(n))
14.代码题:对一个正数组成的数组,用最少的元素构建一个子集,满足该子集之和大于剩余元素之和。输出子集的一种情况即可。
个人答案:
- 直接从大到小排序,计算sum;注:排序面试官说用sort就行了。
- 从前往后遍历将数组分成两部分,当前面部分比后面大时,输出前面数组。
15.代码题:实现两个函数模拟EXCEL的列,一个是由数字到字母,一个是由字母到数字。即28->AC;AC->28。
个人答案:
-
就很基础,注意A对应的数字是1而不是0即可。
-
string InttoName(int a);
-
int NametoInt(string s);
16.文本输入时撤销键应该用什么数据结构实现
个人答案:
- 栈:
先入先出先入后出
反问环节
- 这次表现怎么样?
- 还不错
- 深圳实习有房补嘛?
- 有的,去年记得好像是5000+2000房补
- 面试官一开始说的是属于哪个组?
- -
- 在xxx需要什么技术嘛?
- 需要C++和linux
- 我还需要学习什么嘛?
- 可以多熟悉linux的使用
- 下次面试会问些啥问题呀hhh?
- 这个我不知道,下次面试官不知道是谁
- 但是还有3面
- 3面包括hr面嘛?
- 包括的
- 2技术面+1hr面
- 感觉这次面试的内容太简单了
- 这次面试没有问项目的内容
- 之后的面试会更多偏向项目和技术
- 最后一次技术面会是组里的boss来面
- 后天要笔试了,笔试结果对最终录用有影响吗?
- 这个会参考的,但是不作为决定指标
- 有些同学技术好,有些同学沟通能力强,但总归是喜欢聪明一点的同学。
二面凉经
1. 哪里人
答:广东清远
2. 做个自我介绍吧
答:我叫xxx,广东清远人,本科和研究生就读于xxxx大学,本科是xx专业,大四保研到xx专业。求职意愿是C++后台开发。就这么多。
3. 有什么兴趣爱好
答:打打王者,看看国外名著。
4. 我看你这个简历上面有实习是吗
答:不是的,我放到项目那块了。只是一个合作的项目。
5. C++特性这块哪方面用的比较多,类、STL之类的
答:STL用的多,太好用了。
6. STL中你用哪个容器比较多
答:vector,容器适配器用的栈,队列,哈希表(unordered_map)。
7. vector内存分配怎么样的
答:vector里面有size和capacity,连续分配,如果size>capacity需要重新分配内存。
8. vector初始大小是多少呢
答:这个不太清楚,好像是按照2的幂次数进行向上取整。
9. 其他容器的内存情况呢
答:是我提到的那些嘛(是的)。栈和队列是双端队列的容器适配器,是非连续内存存储的。哈希表(unordered_map)底层是哈希表(有点奇怪)。
10. 析构函数和构造函数可以用虚函数嘛
答:
- 析构应该用:因为如果不虚函数化,基类指针指向派生类对象时,调用析构函数只调用了基类的析构函数。
- 构造函数不应该用:因为虚函数调用机制是根据虚函数指针来调用的,而虚函数指针是需要构造对象之后才有的,因此把构造函数虚函数化会无法成功进行类的实例化。
11. 虚表有多大
答:是指虚函数表吗(是的),虚函数表保存的是虚函数的指针,所以大小是虚函数个数*4个字节
12. 你平时用什么语言
答:C++、Python、Matlab
13. 另外两个语言各自的优点和缺点呢
答:
- Python的优缺点都是一样的,库和包都很多,如果熟悉包和库就能很快很简洁地满足需求。
- Matlab话缺点是脚本语言,没那么灵活。优点是处理矩阵运算特别快。
14. C++11有什么特性
答:
- =delete|=default
- dectype()
- static_cast()
- for(int num:vec_a)
15. TCP滑动窗口什么意思,怎么做流量控制
答:
- 滑动窗口为发送的请求队列,若最左边的请求收到ack,则窗口移动。
- 流量控制包括慢启动、快速重传、一些概念忘了。大概流程是这样……
16. 项目
答:是的。
17. 能说一下用的什么模式吗
答:模式是指并发模式还是I/O复用的模式(I/O复用的模式)。用的是epoll。
18. 那epoll是用什么形式使用的
答:线程池。
19. 我的意思是epoll的触发模式是什么
答:ET模式,边沿触发模式。
20. 为什么要用ET模式
答:要求请求被一次处理,不再进行通知。减少事件遍历个数。
21. 还有什么触发模式吗
答:LT模式。水平触发模式。
22. 两个触发模式的应用场景
答:
- 我觉得LT模式适合请求不能被忽略或者错过的场景,并发量高但是处理能力较低的场景。因为LT会重复通知请求事件。
- ET的话适用于处理能力较强的场景。
23. 那请求量大但简单的场景适合用什么模式
答:ET模式。
24. 实现后的性能怎么样
答:没有测试,对压力测试不是很了解。主要是学习知识。
25. 你上面那个项目也是参考网上别人的项目吗
答:内存池吗(是的)。是的。
26. 大概讲下实现的原理
答:
- 三层缓存的结构
- 快是因为线程都有各自独立的Thread Cache,不用加锁。
- 第二层是管理Thread Cache内存分配和释放的Central Cache。
- 第三层是以Page为单位的Page Cache。
- 数据结构使用的是Free-list,细节很难说得清楚。。。
27. 那你从这两个项目里面学到了什么
答:
- C++单例模式。
- 内存池。
- 另一个项目主要就是网络的相关知识,像I/O复用这些。
28. 你在Linux下开发过吗
答:最近换的macos,只会一些基本的操作。
29. 写过makefile吗
答:没有。(那你这两个那么大的项目怎么编译?)直接g++,其实这两个项目很小。
30. 怎么用指令修改文件大小
答:不了解
31. 你使用Linux时常用的指令
答:top、ls、cat、touch、cp、rm、mkdir、netstat
32. 用过什么数据库
答:MySQL
33. 会写SQL语句吗
答:本科学过,用得少不太记得了。
34. 怎么加速查询
答:最简单的方法:使用索引
35. 为什么使用索引快
答:索引能够缩小遍历的范围,和查字典一样,比如查林字,可以直接查L的拼音。
36. 索引快的原因是什么
答:不太清楚。我知道索引有哈希索引和B树索引。
37. 索引的存储格式是什么
答:我觉得应该是树。。。不清楚
38. 介绍一下项目
答:
39. 你英语怎么样,能用英语说一下上面这个项目吗
答:普通交流程度。直接介绍的话有点难,因为没有准备。但是如果是沟通的话可以的。
40. 算法题:char a[n]和char b[m],用最小时间复杂度和最小空间复杂度构建数组c,c的元素为a中与b不重复的元素。(就是c=a-b)用C语言写。
答:疯狂argue,忘了怎么写动态数组,而且这个输入输出没给定。我先讲下思路吧。因为是字符串,所以用128长度的int数组表示b中对应字符的出现情况。若出现,置为1,没出现置为0。遍历a数组,若对应位置为0,加入c,否则不加入。实现的时候最终还是用上了心爱的vector数组。被怼了句“用C++我还考你什么算法”
闲聊环节
1. 你非科班怎么学计算机的
答:本科有辅修操作系统、计网、数据库。课余时间看推荐的课程,b站等学习网站很多。
2. 你对从事游戏领域的工作有兴趣吗
答:挺感兴趣的。
3. 你玩什么游戏
答:以前玩的多。王者荣耀、和平精英。端游的话玩DNF。
三面速度面(20min)
1. 自我介绍
2. 介绍项目
3. 介绍项目
反问环节
1. 这次是第几次面
2. 这次面试怎么样
3. 如果这次过了下次是什么面
字节一面二面三面
一面(40min)
因为一二面是连续面的,而且一面难度很低,就没记录了。
二面(1h20min)
1. 先做个自我介绍吧
个人答案:
- 姓名、学校、本科、硕士、研究方向、转C++开发原因。
- 项目自上往下按照自己的理解依次介绍。
- 以上就是我的自我介绍。(最后一句话)
2. C++的STL里面有哪些容器
个人答案:
- 序列式容器:vector、
string、list、deque、queue(稍微提一下容器适配器)、stack、slist(顺带提一下C++11才实现的标准forward_list)。 - 关联式容器:map以及它的几个变种,set以及它的几个变种。
3. 为什么会用到unordered_map
个人答案:
- 散列表作为不考虑顺序的键值对很好用。
- 刷题的时候要用到。
4. 你刷题刷的什么题目,看你简历上面也没有ACM的比赛经历
个人答案:
- ACM已经不能参加了,要高中毕业后5年内才能参加。
- 刷题刷的leetcode上面的题,大概刷了一个月。
5. 所以说你是最近刷的题吧,就是为了准备面试对吧,说实话就好
个人答案:
- 是的,其实是寒假过年的时候刷的了,最近刷的少了。
6. 那我出道题考考你。(map怎么删除value值为奇数的节点)
个人答案:
-
我觉得这道题的难点应该在于迭代器失效吧。
-
然后写了代码,出了几个问题。。。。。。。
-
第一个问题,忘记了怎么取map的value值,不确定是不是当作pair来处理,面试官说是的,但是问我为什么不知道这种访问方式,解释说一般在使用map的时候都是作为读取,然后写了一个if ( map.find(x)!=map.end() ) { int y = map[x] }这也为下一个问题做了铺垫。
-
第二个问题,这个问题是他后来快结束的时候又返回来问我这个代码有没有问题的。当时写的代码是
void func(map<int,int>& mapKeyValue){ for(auto it:mapKeyValue){ if(it.second%2){ mapKeyValue.erase(it++) } } }
他问我,it++真的没问题吗,我回答说这样会跳过被删除的迭代器,他反问,那你这个for循环不是又回递增迭代器吗。好的,发现错误了,他让我重新写一个,我写了while循环。
-
第三个问题,改成这样你再确认一遍,真的没问题了吗?看了一遍,我暂时发现不了问题了。嗯,你回去看看it是什么类型的变量,真的可以使用.操作符吗,立马纠错,哦哦,应该用指针。
7. 那你说说看什么容器可以使用[]进行访问,以及访问的原理
个人答案:
- 首先说哪些容器吧,序列式容器里面的vector、
string、deque,关联式容器map。 - 原理是对内存连续,所以可以通过头指针进行偏移操作来访问。但是其实map的[]访问是一种搜索二叉树的过程。
8. 如果让你来对网络进行分层,你会怎么分,不一定要7层和4层5层,就按你的理解就行
个人答案:
- 那就分为五层吧,物理层、数据链路层、协议层、应用层。
- 这样分的理由是我认为传输层和网络层协议的层次关系有点复杂了,所以干脆分为一层hhh。
- 然后物理层就是各种物理通信方式
- 数据链路层负责将各种通信方式提供一个统一的接口向上为协议层服务
- 协议层这么分主要是HTTP加了好多层东西,TLS/SSL在HTTP和TCP/UDP之间(挖坑)
- 应用层呢就是各种应用浏览器使用协议进行通信
9. 按照这么分的话HTTP在哪一层
个人答案:
- 这个,在协议层。反问,在协议层吗?嗯,应该是在协议层里面具体的网络层。你确定吗?不要用猜的,或者也可以用猜的。但是你要根据能得到的知识来进行推测,推测总比完全猜要好对吧。嗯,那么其实我认为HTTP本身是在TCP/UDP之上的,那么肯定不在传输层,而HTTP应用于各种浏览器场景,我认为是应用层。(我是真忘了在哪一层,确实是应用层)
10. TCP/UDP的区别有哪些呢(好像是一面的问题了,分不清了)
个人答案:
- 有连接、无连接
- 可靠、不可靠(顺便提一下HTTP/3使用的就是UDP,但是是可靠的,模仿了TCP的实现)
11. TCP为什么可靠呢(好像是一面的问题了,分不清了)
个人答案:
- 确认和重传
- 流量控制
- 拥塞控制
- 序列号保证有序(他说也算)
- 校验和(他反馈这个确实是他想听到的答案)
12. 说一下拥塞控制(好像是一面的问题了,分不清了)
个人答案:
- 慢启动、拥塞避免、快重传、快恢复。公式太多,细节记不清了,但是曲线是知道的。
- 拥塞控制的主要思路呢是通过拥塞窗口来影响流量窗口。
- 慢启动是指数上升,拥塞避免线性上升,快重传直接减半,快恢复线性上升。
13. 介绍一下HTTP/1 HTTP/2 HTTP/3的发展吧
个人答案:
- 技术的发展都是为了解决某些问题
- HTTP/1的问题是短链接每次都需要三握四挥、不安全(HTTPs)、无状态(Cookie)、服务端不能主动发送。
- HTTP/2默认了长连接(Keep-Alive)、引入TLS/SSL、Cookie、服务端主动发送、头部压缩、多路复用。但是还有队头阻塞的问题(因为虽然进行了长连接,但是还有一种情况会出现队头阻塞,那就是 丢失重传)。
- HTTP/3使用UDP解决了丢失重传导致的队头阻塞,并且使用了TLS/SSL1.3减少了建立HTTPs连接的时间到1.5-2个RTT(往返时间),还引入了二进制编码,其他细节忘记了。
14. 你知道怎么建立0RTT的连接吗
个人答案:
- ????????????????我直接一堆问号,有吗有吗?(然后他也慌了。。。说是1RTT。。。然后最后又说确实就是0RTT。。。行吧,不懂,技术牛逼。)
- 后来查了看看,QUIC也就是HTTP/3使用的技术有一个连接恢复,是建立在连接在以前建立的基础上的。QUIC 是如何做到 0RTT 的
15. 介绍一下项目
个人答案:
16. 这个web服务器我就不问你了,感觉人手一个
个人答案:
17. 项目
个人答案:
18. 做题吧:长度为TotalSize的数据怎么分为最长大小限制为Size的小数据块,要求块数越小越好,块长度的差值越小越好。
个人答案:
- 先说思路吧,直接分就好了,TotalSize/Size,然后还有余的话+1。(talk is cheap,show u code,他叫我写代码)
- 写代码我是真的服了,不让我写ACM模式,还非得说你就假设这两个变量已经定义好了。嗯……就是不让我运行debug呗。然后还说都是整数,尼玛,整数就难顶了啊,答案就变成了{size,size,size,size,.....,size-1,size-1,size-1};就很烦。
- 最后还反问,你确定这样构造出来的数组求和为TotalSize吗(玩战术的人心都脏!离谱)确认。
19. 我出个场景题吧,现在很多大公司都有一个困境,早晚高峰的时候很多员工堵在电梯。导致很容易迟到。你想个办法吧。什么办法都行,除了加电梯。。。10部电梯-100层楼-每层楼人数相同-员工早高峰同时抵达。
个人答案:
- 一个想法是每部电梯只固定的10层。如1号只去1-10,2号只去10-20,这样往返时间就短了很多了,就不用每次都停顿100次。
- 还有更好的想法吗。
- 好家伙,这还不行,行吧,那就需要辛苦一下员工了hhh
- 这样吧,我们把电梯的层数减少5倍,意思就是电梯只能去1 5 10 15 20 25层,之后要去到具体的层数让员工自己爬楼梯去吧,反正最多只要爬三层楼梯。顺便在加上我第一个思路,还能有效进行秩序的管理。
- 可可可,其实这个问题没有正确答案,但是就是希望面试的同学能够想到楼梯,不要把目光只放在电梯上。
20. 如果我们这场面试不存在,或者说如果我和你第一次见面,你怎么用简短的话说服我招你。当然100句话也可以,但是2句话能就解决的就不要再多了。
个人答案:
- 开始胡扯(首先我最大的特点是善于与人沟通,与他人合作能力强,并且学习能力很强,面对他人指出的错误能够很好的接受并改正,当然技术业务能力也靠谱。最后一点,hhhhhh我自愿加班。)
三面凉经(1h。反问环节纯作死勿模仿)
1. 自我介绍
2. 介绍一下研究生的研究经历
3. 为什么算法转开发
4. 项目
5. 项目
6. 项目
7. 项目
8. 二分(扣细节)
9. 反问环节(喜闻乐见尬聊几分钟,满足面试官虐我的请求)
1. 这次面试是不是比较差
怎么样呢,没有好与坏的说法。最后的结果也是一个根据匹配度来进行选择的。
2. 大概多久会有通知
3-5天会有hr打电话通知