首页 > C++后台:从实习到秋招的总结(已签腾讯微信)
头像
MRWu_haha
编辑于 2021-01-23 14:29
+ 关注

C++后台:从实习到秋招的总结(已签腾讯微信)

这是我实习到秋招的笔记资料
链接:https://pan.baidu.com/s/1p3K6VILrMexeb8ciCRitdQ
提取码:zsu6
虽然内容会因为本人字太丑而难以理解(😂😂😂),但是复习没思路的同学可以大致看一下我的复习框架(仅供参考哈),如果笔记内容有错的话欢迎指正,相互学习进步!
_________________________
2020从春季面试实习到秋招,前前后后总共投了30多份简历,也笔试面试无数场,刚开始找实习时面试的过程真的太艰难了,面试一个就挂一个,而且简历挂的也很多。中间经过几个月的复习和复盘,终于在秋招收获了几个大中场的offer(字节,腾讯,网易,BIGO,拼多多,华为因为太晚开奖,所以就直接拒掉了,具体的面经可以看我以前的帖子),也签了一份比较满意的工作。个人在找工作的过程中的感想主要包括几个方面:1、简历;2、基础知识;3、算法题;4、项目经历。本人没有实习经历,没有实习有多方面的原因(😂😂😂),如果有实习经历的话秋招应该会更顺一点,建议各位在找工作的小伙伴最好先找一份实习。下面主要分为以下四个方面来介绍找实习以及秋招的过程中遇到的一些问题,希望能对各位小伙伴们有所帮助。

1、简历

简历是笔试面试的入场券,也是面试官能在面试前系统性了解你的一个方式,因此简历是非常重要的。个人认为简历最好要简洁扼要,主要写明自己的教育经历,技术栈,项目经历,实习经历等,而且写的内容最好和求职岗位相关性比较大,而不是越多越好。本人本科学的是通信专业,参加了几个大型比赛,但是主要是和嵌入式相关的,刚开始找实习时,把这几个大型比赛都写到了简历上,相反没有写自己做的和后台相关的小项目,导致了简历筛选不通过,就算通过内推进了面试,面试官也对这几个项目兴趣不大,即使介绍了面试官也不了解这方面的内容,每次面试都草草结束,然后就都挂了。

另一方面就是最好写上自己在项目中做的贡献,用到了相关的技术,这样面试官在根据简历问问题时,会偏向你写的这几个关键技术上问。例如我在简历上写了该项目涉及网络编程,多线程,IO多路复用等,面试官在面试的时候就会问我网络上遇到的问题,多个线程怎么同步的,IO多路复用是怎么实现的以及原理等等,针对这些技术点详细复习就可以在面试时游刃有余。

在简历上也可以写上一些班干或者社团工作经历等,用一两句话简单带过,这样可以说明你在团队中具有一定的团队协作能力以及其他一些工作上的能力。可能技术面的面试官不会问相关的问题,但是HR面试这些经历都是常问的内容。

2、基础知识

基础知识方面呢,后台对于计算机相关的基础知识要求还是非常广的。无论找工作时用的是java或者C++还是其他语言,语言基础是必要的,必须熟知所用语言的相关特性。C++无非就是封装、继承、多态、stl等以及其中的底层实现原理。其他的就包括计网,数据库,操作系统,linux相关知识,设计模式,分布式等等。这些知识的理解不能停留在表面,必须深入!还记得刚开始面试的时候,面试官会在一个问题上深入提问,但是一深入问我就答不出来了,也导致刚开始面试时一直挂。所以基础知识必须要深入的理解,而且如果有结合这些知识,在实际的项目应用上解决问题的经历就更好了,比如我有一个网路相关的项目,在其中遇到了一些问题,结合TCP的原理,对该问题进行分析,并最终解决,在面试时面试官问到TCP相关内容时,就可以扩展到这个项目上。可能知识的内容多了会比较乱,我的解决方式是通过笔记以及思维导图的方式,可以将有关联的知识关联到一起,方便记忆,比如数据库里面的为什么要使用索引以及B+树结构,日志等等都是和操作系统的内存和硬盘访问数据的方式相关的。推荐大家要多记笔记,毕竟“好记性不如烂笔头”,我在面试复习的过程中用ipad记录了大部分的重点知识,查阅的时候相当方便,多写几遍也可以加强记忆(只是本人字太丑了)。


为了方便各位找工作的牛友能够查找到我之前面试过程中的一些基础知识相关的问题,我在下面按照各种知识点的分类,总结了我面试过程中遇到的一些面试问题,虽然相对于一些问题集是不太全的,但是都是我面试的时候遇到的问题,而且把面试中一些重复问到的问题加粗,方便大家有针对性地查阅。如果要根据的公司看面经的话可以看我文末的链接

C++相关

1、  C++能否在有参构造函数中调用无参构造函数,无参构造函数中如果有修改类成员会不会对当前正在构造的类产生影响,这种调用方式有什么优势或者缺点。

2、  C++的构造函数中能不能调用虚函C++的构造函数中能不能调用虚函数数

3、 指针和引用的区别,你更倾向于使用指针还是引用,为什么

4、 C++vector插入和删除为什么会导致迭代器实效

5、 C++的左值和右值,怎么使用,有什么区别,std::move()函数(std::move()的实现原理)

6、 程序的编译连接,静态链接和动态链接,分别什么时候链接的

7、  虚函数与纯虚函数的区别

8、 C++多态,重载重写

9、  虚函数表和虚函数指针存放在那个位置

10、 派生类的虚函数表与基类的虚函数表是同一个虚函数表吗,子类重写的虚函数怎么覆盖基类的

11、 面向过程和面向对象各自的优缺点

12、 内存屏障,volatile作用,是否具有原子性,使用volatile会对编译器有什么影响

13、 可执行文件的文件格式(ELF文件格式)

14、 struct字节对齐的规则

15、 智能指针的作用(几种只能指针要非常熟悉)

16、 C++中的内存泄漏(举例几个内存泄漏的场景)

17、 怎么实现一个线程池

18、 C++的构造析构顺序

19、 构造函数能否是虚函数

20、 析构函数什么时候要定义为虚函数,什么时候不用

21、 static的作用

22、 怎么用一个指向子类的基类指针调用基类的虚函数(强制转换或者指明作用域d->Base::fun()

23、 函数返回值可以是unique_ptr,为什么

24、 malloc和new的区别

25、 智能指针enable_shared_from_this

26、 写一个字符串类的移动构造,拷贝构造,赋值构造并模拟这几个过程

数据结构

1、  哈希表的实现原理

2、  在插入多查询少时使用哪种数据结构

3、  在插入和查询差不多的情况下选择哪种数据结构

4、 topK用什么排序解决

5、 哈希冲突

6、  快排的时间复杂度,什么时候最坏,什么时候最好

7、  红黑树和AVL树有什么区别,为什么C++map要用红黑树

8、  设计一个容器,有insertminmax要求这三个操作有最小的时间复杂度。

C++内存管理

1、  什么情况下会出现段错误,为什么段错误程序会直接终止

2、 C++和C的全局变量,全局静态变量,局部静态变量等存储在哪里

计算机网络

1、 TCP建立连接和断开连接的步骤

2、 什么场景下机器产生大量的time_wait,有什么影响

3、 TCP怎么保证可靠性

4、  怎么用程序判断一个系统是大端字节序还是小端字节序

5、  TCP和UDP的区别

6、  DNS解析过程以及DNS劫持

7、  HTTP2.0与HTTP1.0HTTP1.1的区别,有什么优势

8、  网络七层模型

9、  阻塞socket和非阻塞socket的区别

10、 TCP建立三次握手的过程,为什么初始化序列号要随机取,从0开始会出现什么问题

11、 TCP为什么要有确认号

12、 TCP三次握手,画图

13、 从局域网访问一个URL的整个过程,NAT技术,DNSARP协议等

14、 如果有一个包1M,怎么分片

15、 把TCP的头部写出来看看

16、 TCP相关慢启动,拥塞避免,快重传,快恢复

17、 TCP中有一个包丢了怎么重发,接收端失序的包放在哪里

18、 服务端怎么解析http请求

19、 服务端怎么同时处理多个请求

20、 为了保证通信之间的安全要怎么做(https

21、 https的TLS握手过程

22、 https会不会出现中间人攻击

23、 对称加密与非对称加密原理

24、 如果接收缓冲区满了,发送端怎么操作,会报错吗

25、 发送端发送socket阻塞对发送端接收数据有影响吗

26、 HTTP,TCP,IP三者的关系

27、 HTTP的加密方式,MD5RSADES加密有啥区别

28、 socket通信编程需要调用哪些api

29、 socket发送速度过快会发什么什么

30、 socket中的EAGAIN错误码

31、 IPv4和IPv6的区别

32、 掩码的作用

33、 广播地址是多少

操作系统

1、 进程和线程的区别,分配给进程的资源是什么

2、 虚拟地址空间的作用,怎么从虚拟地址空间转换到物理地址空间

3、 内存物理页置换算法

4、  介绍一下IO多路复用

5、 线程之间的同步机制

6、 有哪几种锁,每种锁的使用场景,你用过哪几种锁,用过信号量吗

7、 缓存的管理方式(LRULFU

8、  有没有遇到过死锁,怎么解决的,死锁的必要条件

9、  将一个文件从内存中写入磁盘,设计一种数据结构来加速这个过程(应该是LSM树)

10、 负载均衡的算法

11、 CPU流水线

12、 缓存一致性协议

13、 程序中通过地址读取一个变量的过程(虚拟地址到物理地址,MMUCR3,转换的细节,这里问了一个我不懂的名词,说是MMU获取页目录地址的过程)

14、 一个进程的地址空间分为几段

15、 进程优先级和CPU的任务调度策略(优先级反转)

16、 高并发下同时操作任务队列

Linux相关

1、  Linux命令 awkstracegdb调试相关

2、  Linux常用命令

3、  Linux与Windows最大的区别

数据库相关

1、  介绍一下数据库的两种引擎

2、  Mysql和Myisam使用select * 查询的过程的区别(MyIsam是非聚集索引)

3、  Mysql使用索引查询和不使用索引查询的查询流程,效率差多少(B+树)

4、 数据库的索引如何加速查询过程,为什么不用红黑树

5、  Id 主键索引 (a,b)联合索引

①    Select * from table where a=** and b=**;

②    Select a,b,Id from table where a=** and b=**;

上面两个查询那个更快(回表查询和索引覆盖

select * from table where a>** and b=**;用到了什么索引

select * from table where b=**;会用索引吗

6、k-v存储

7、数据库相关的问题,给了一个表的三个字段uidday(精确到天),订单内容

①、 查询某个用户一天内的订单

②、 查询某个用户一个月的订单

③、 查询某一天的全部订单

让你设计一个合理的索引

思考类题型

1、  一个32位的机器,有一个100G的文件,里面存储的是数字,要对这个文件进行排序,选择哪种排序方式,怎么实现

2、  你更倾向于使用多线程还是多进程,为什么

3、  除了selectpollepoll,如果让你实现第四种IO多路复用,你会怎么设计

4、  为了进一步提高并发量,客户端可以怎么做,服务端可以怎么做

5、  如果目标服务器被代理服务器劫持会怎么样

6、  从一个文本中读取出现频率最大的10个单词

7、  有一个大文件有用户的登录信息,文件包含10亿条目,文件格式,uidlogin_timelogout_time,编写一个函数,获得一天内登录的峰值人数

8、  在一个很大的文件中寻找最大的K个数



3刷题

算法题是笔试必考的内容,也是面试中经常会出现的题目,而且有些公司会非常看重代码能力,而代码能力往往都是通过算法题体现的。在找工作期间,我总共刷了350+leetcode题以及牛客上的剑指offer,刷题不需要追求数量,但是一定要囊括所有可能用到的技术点,包括,数组类题目,树相关题目,链表相关题目,栈,队列,堆,动态规划,贪心,单调栈等等。这些内容在牛客或者leetcode上都有分类。多刷题的目的,其实就是为了能够比较快地看出题目需要用什么方法解决,毕竟无论题目怎么变化,最终的解决方法都大同小异,因为面试或者笔试的思考时间都是有限的。另一方面,提高刷题的质量和效率最好的方式就是多刷一些高频的题目,特别是牛客或者leetcode上一些公司套题,虽然我刷的题目不多,但是基本上能应付大部分题型。算法题最好多刷几遍,一道题只刷一遍是远远不够的,容易忘记解题思路和方法,多刷几遍能够巩固相同题型解题方式,也能在遇到相似的题目是快速联想到已经做过的题。我每道算法题基本都刷了3次以上,不太熟悉的题目刷的次数会更多。也可以从其他的笔经面经中收集高频题目,有针对性地刷题。(9月份拿到几个offer之后就没刷过了,太懒了😂😂😂
第二个要注意的就是拿到题目千万不要埋头写,可以和面试官讲讲思路,然后再写题(我有好几次题目理解不对,代码写完后跑的时候没跑通,和面试官沟通了之后才知道题目理解错了,但是也没时间重新修改了,就这样凉凉了),这个时候可以和面试官分析有多少种方法,时间复杂度以及空间复杂度是多少等等,在面试的时候可以加分。

以下是我在面试的过程中遇到的所有算法题,为了方便牛友,我也总结在这里了,如果想按照公司查找可以看文末的链接

算法题

1、  两个一组翻转链表

2、  实现memcpy,考虑函数的鲁棒性

3、  最大连续子序列和,输出这个序列

4、  实现一个实时投票排名系统,用户有两种,一种是投票的用户,每人有一票,另一种是候选人,并且有一个函数,返回获得票数实时排名前100的用户,返回的这100个用户也要有序。

5、  图的广度遍历

6、  最长无重复子串(子串长度超过long long长度)

7、  反转字符串,字符串中的单词不用反转(“HERE IS BYTEDANCE”------>“BYTEDANCE IS HERE”)时间复杂度分析

8、  升序序列的查找出现目标target第一次出现的位置

9、  奇偶链表

10、 二叉搜索树找到第K大的节点,不能转存

11、 接雨水

12、 rand35()实现rand47()

13、 两个链表相加

14、 数组循环移动K

15、 最长无重复子串

16、 K个一组反转链表

17、 实现一个strcpy函数,考虑内存覆盖(源串可以被修改,保证复制的目的子串正确),实现多个字节同时拷贝(4字节或者8字节)

18、 给一个无序数组,数组中有重复的数字,另外给一个参数n,每个重复元素为一组删掉除了第n个之外的其余重复元素。如果重复的元素不超过n,则保留重复的最后一个元素。

输入:【2 2 2 3 3 2 2 4 5 3 4 7 8 1n=3

输出:【2 5 3 4 7 8 1

删除除了第三个2之外的其余的2:【2 3 3 4 5 3 4 7 8 1

删除除了第三个3之外的其余的3:【2 4 5 3 4 7 8 1

由于4只有两个,保留最后一个删除其余的4:【2 5 3 4 7 8 1

19、 螺旋遍历一个数组leetcode54

20、 判断一颗二叉树的中序遍历是否有序

21、 循环升序链表(首位相接),给你链表中的任意一个位置的指针(不一定是最小的)和一个准备插入的值,找到要插入的位置使插入后的链表仍然是循环升序的。

22、 走迷宫

5 5

0,0,0,0,0,

0,1,1,0,1,

1,0,0,0,1,

1,1,1,0,1,

0,0,0,0,0,

0是通路,1是墙,求最短路径并打印路径信息。


4项目经历

项目经历也是比较重要的一个部分,如果有比较好的项目经历,面试官就会提出偏向于项目相关的问题。即使没有很对口的项目,至少也要写上一些用到的技术点与求职方向比较相关的项目,比如我在找实习时,只有实验室以及以前本科做的一些小项目,我也尽量在项目中标注出和后台相关的一些技术点,这样可以让面试官在面试的时候有相关的技术可以和你探讨。项目可以巩固基础知识,所以我在秋招前花了一部分时间在一个Web后台服务器项目上,基本上涵盖了网络编程,多线程编程,IO多路复用,HTTP状态机以及reactor模型等等,另一方面该项目也比较易于理解,对于刚刚尝试C++后台开发的同学用处是非常大的。当然,看懂了原理之后必须自己实现一遍,只有真正实践了才知道其中会出现什么问题,有什么难点,这个在看别人写的项目时是没办法获取的,所以我也花了一段时间复现了Web服务器,并且进行了压力测试,还在项目上增加了其他的技术来提高并发。

对于刚刚尝试C++后台开发又没有合适项目的同学,想要通透地理解这样一个项目还是有一定难度的,刚好牛客上有一个Web服务器项目的讲解课程,可以很快并且详细地了解一个Linux Web服务器后台项目的搭建过程以及技术点,为了再巩固加深理解,我也买了这个课程,学习了前面已经更新的几节内容,发现老师讲得非常详细,而且还有老师负责答疑,解决了我之前项目中的一些疑惑,包括课程的PPT以及相关的代码都可以下载下来,将程序跑一遍还可以加深理解。

通过链接:https://www.nowcoder.com/courses/cover/live/504?coupon=AuIz7uC购买C++高薪求职项目课程可以立减150元。如果已经通透地搞懂了这样的一个项目,可以进阶地想一想项目的优化方向,为项目锦上添花,也体现了自己独立思考和解决问题的能力。

总结

总结秋招的这么多场笔试与面试,最重要的就是不断复盘,记笔记,我在找工作期间做的知识笔记非常多,笔记是总结知识最好的方式,当需要巩固某个知识点时,也可以从笔记上快速获取。复盘是查漏补缺的一个好的方式,复盘时也可以自己联想关于当前知识点能够扩展的其他问题,扩展自己的知识面。具体的笔经面经可以看看我之前写的帖子。秋招一路走来,简历挂以及笔试面试挂的次数也不少,庆幸自己能够坚持下来,希望小伙伴们也能够找到一份心仪的工作,虽然我不是什么技术大牛,但是希望我的经验能对即将找工作的同学有所帮助,祝大家都能找到心仪的工作。

最后附上我的面经
腾讯WXG
字节跳动
BIGO
拼多多
华为
网易

更多模拟面试

全部评论

(29) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

热门推荐