提取码:zsu6
虽然内容会因为本人字太丑而难以理解(😂😂😂),但是复习没思路的同学可以大致看一下我的复习框架(仅供参考哈),如果笔记内容有错的话欢迎指正,相互学习进步!
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
数据结构
1、 哈希表的实现原理
2、 在插入多查询少时使用哪种数据结构
3、 在插入和查询差不多的情况下选择哪种数据结构
4、 topK用什么排序解决
5、 哈希冲突
6、 快排的时间复杂度,什么时候最坏,什么时候最好
7、 红黑树和AVL树有什么区别,为什么C++的map要用红黑树
C++内存管理
1、 什么情况下会出现段错误,为什么段错误程序会直接终止
2、 C++和C的全局变量,全局静态变量,局部静态变量等存储在哪里
计算机网络
1、 TCP建立连接和断开连接的步骤
2、 什么场景下机器产生大量的time_wait,有什么影响
3、 TCP怎么保证可靠性
4、 怎么用程序判断一个系统是大端字节序还是小端字节序
5、 TCP和UDP的区别
6、 DNS解析过程以及DNS劫持
7、 HTTP2.0与HTTP1.0和HTTP1.1的区别,有什么优势
8、 网络七层模型
9、 阻塞socket和非阻塞socket的区别
10、 TCP建立三次握手的过程,为什么初始化序列号要随机取,从0开始会出现什么问题
11、 TCP为什么要有确认号
12、 TCP三次握手,画图
13、 从局域网访问一个URL的整个过程,NAT技术,DNS,ARP协议等
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的加密方式,MD5,RSA,DES加密有啥区别
28、 socket通信编程需要调用哪些api
29、 socket发送速度过快会发什么什么
30、 socket中的EAGAIN错误码
31、 IPv4和IPv6的区别
32、 掩码的作用
33、 广播地址是多少
操作系统
1、 进程和线程的区别,分配给进程的资源是什么
2、 虚拟地址空间的作用,怎么从虚拟地址空间转换到物理地址空间
3、 内存物理页置换算法
4、 介绍一下IO多路复用
5、 线程之间的同步机制
6、 有哪几种锁,每种锁的使用场景,你用过哪几种锁,用过信号量吗
7、 缓存的管理方式(LRU,LFU)
8、 有没有遇到过死锁,怎么解决的,死锁的必要条件
9、 将一个文件从内存中写入磁盘,设计一种数据结构来加速这个过程(应该是LSM树)
10、 负载均衡的算法
11、 CPU流水线
12、 缓存一致性协议
13、 程序中通过地址读取一个变量的过程(虚拟地址到物理地址,MMU,CR3,转换的细节,这里问了一个我不懂的名词,说是MMU获取页目录地址的过程)
14、 一个进程的地址空间分为几段
15、 进程优先级和CPU的任务调度策略(优先级反转)
16、 高并发下同时操作任务队列
Linux相关
1、 Linux命令 awk,strace,gdb调试相关
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、数据库相关的问题,给了一个表的三个字段uid,day(精确到天),订单内容
①、 查询某个用户一天内的订单
②、 查询某个用户一个月的订单
③、 查询某一天的全部订单
让你设计一个合理的索引
思考类题型
1、 一个32位的机器,有一个100G的文件,里面存储的是数字,要对这个文件进行排序,选择哪种排序方式,怎么实现
2、 你更倾向于使用多线程还是多进程,为什么
3、 除了select,poll,epoll,如果让你实现第四种IO多路复用,你会怎么设计
4、 为了进一步提高并发量,客户端可以怎么做,服务端可以怎么做
5、 如果目标服务器被代理服务器劫持会怎么样
6、 从一个文本中读取出现频率最大的10个单词
7、 有一个大文件有用户的登录信息,文件包含10亿条目,文件格式,uid,login_time,logout_time,编写一个函数,获得一天内登录的峰值人数
8、 在一个很大的文件中寻找最大的K个数
3刷题
算法题
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 1】n=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元。如果已经通透地搞懂了这样的一个项目,可以进阶地想一想项目的优化方向,为项目锦上添花,也体现了自己独立思考和解决问题的能力。
总结
全部评论
(29) 回帖