面试面试面试new
1. 语言基础(C/C++)
Q: 谈谈C nCPP给你最大的区别感受, 什么是高级语言,高级何在?
Q: 谈谈C,C++的内存管理(开放性问题,比如malloc, new等区别;viod*是什么指针?怎么用? delete[]原理,怎么找到数组有多少个元素的)
Q: 谈谈高级语言的三大特性->谈谈设计模式,封装之类的,单例之类的;
Q: 谈谈菱形继承和如何解决->虚基表
Q1:C++多态如何实现?虚函数表原理?与虚基表对比一下讲讲区别
✅ 核心答案:
静态多态:函数重载、模板(编译期决议)。
动态多态:虚函数(运行期决议),基类指针调用派生类方法。
虚函数表:每个含虚函数的类有一个虚表(存储函数指针),对象隐含虚表指针(vptr),调用时通过vptr查表。
Q: 谈谈指针和引用的区别
Q2:C++智能指针, 用过哪些?shared_ptr如何解决内存泄漏问题?
✅ 核心答案:
unique_ptr:独占所有权,禁止拷贝(移动语义),适用于单一拥有者场景(如局部对象管理)。
shared_ptr:基于引用计数实现共享所有权,自动释放内存,需注意循环引用问题(可结合weak_ptr解决)。
weak_ptr:不增加引用计数,用于打破shared_ptr循环引用。
例如:std::shared_ptr<Object> sp(new Object); 在离开作用域时自动析构。
Q3:谈谈深浅拷贝,右值引用与移动语义的作用?
✅ 核心答案:
右值引用(&&):绑定临时对象(如函数返回值),避免深拷贝。
移动语义:通过转移资源所有权(如指针)提升性能,如std::move将左值转为右值,触发移动构造函数/赋值运算符。
应用场景:STL容器扩容时,移动元素而非拷贝。
Q4:vector和list的底层实现与适用场景?
✅ 核心答案:
vector:动态数组,连续内存,支持随机访问(O(1)),增删中间元素效率低(需移动后续元素)。
list:双向链表,非连续内存,插入/删除O(1),访问需遍历(O(n))。
选型:高频随机访问用vector,频繁增删用list。
2. 数据结构与算法
Q1:谈谈BST AVL树, 谈谈红黑树的特点与优势?
✅ 核心答案:
特性:①节点红/黑;②根和叶(NIL)为黑;③红节点子必黑;④任意路径黑节点数相同。
优势:近似平衡的BST,插入/删除/查找均为O(log n),相比AVL树旋转次数更少,适合频繁修改场景(引申map/set)。
Q2:哈希表冲突解决方法?
✅ 核心答案:
链地址法:冲突元素挂链表(如Java HashMap)。
开放寻址法:线性探测、二次探测、双重哈希,需注意负载因子扩容。
再哈希:使用第二个哈希函数计算新位置。 (引申unordered系列)。
Q3:动态规划与贪心算法的区别?
✅ 核心答案:
DP:通过子问题最优解推导全局最优,需满足最优子结构和无后效性(如背包问题)。
贪心:每一步选局部最优,无法回退(如Dijkstra算法),需证明贪心选择正确性。
题目1: 反转链表: 本地从节点设计和方法开始写, 普通一趟扫描+递归看下边界处理如何
题目2: https://editor.csdn.net/md/?articleId=128264196 经典数组问题,也是本地写,变种位运算+优化空间
3. 操作系统
自由: 讲讲常用的linux指令,抓感兴趣的延伸, (eg: nslookup查看dns解析, ps 查看进程状态pid)
Q1:进程间通信(IPC)方式及优缺点?
✅ 核心答案:
管道:单向,父子进程间通信,容量有限。
共享内存:高效(无需内核介入),需同步机制(如信号量)。
消息队列:异步通信,支持多进程,但数据拷贝有开销。
信号量:控制资源访问,常用于同步。
Q2:线程同步方式(互斥锁 vs 条件变量)?引申,自旋锁适用场景,伪代码
✅ 核心答案:
互斥锁:保护临界区,同一时间仅一个线程访问资源。
条件变量:搭配互斥锁使用,当条件不满足时线程阻塞(如生产者-消费者模型)。
Q3:死锁的必要条件及解决方法?
✅ 核心答案:
必要条件:互斥、持有并等待、非抢占、循环等待。
解决:破坏任一条件,如银行家算法(避免死锁)、资源有序分配法(破坏循环等待)。
4. 网络
QQ: 讲讲整个五层模型网络架构:挑感兴趣的问
QQ: HTTP深度挖掘(最近HTTP的bug给我整麻了,好好拷打一下header这些)https://blog.csdn.net/wtl666_6/article/details/126876050
QQ:版本1.2.3的区别 https://blog.csdn.net/wtl666_6/article/details/128697770
Q1:HTTP与HTTPS的区别?SSL/TLS如何工作?
✅ 核心答案:
HTTP:明文传输,端口80。
HTTPS:HTTP+SSL/TLS加密,端口443,通过数字证书验证身份。
SSL流程:①客户端请求证书;②服务端发送证书;③协商会话密钥;④加密通信。
Q2:TCP三次握手与四次挥手过程?为啥不是2 or 4次
✅ 核心答案:
三次握手:SYN→SYN+ACK→ACK(建立双向连接)。
四次挥手:FIN→ACK→FIN→ACK(双方确认关闭)。
TIME_WAIT作用:确保最后一个ACK到达,避免旧连接数据干扰新连接。
Q3:epoll相比select/poll的优势?
✅ 核心答案:
select/poll:遍历所有fd,时间复杂度O(n),fd数量受限。
epoll:事件驱动,内核维护就绪队列,时间复杂度O(1),支持水平/边缘触发(LT/ET),百万级连接高效处理。
5. 数据库
Q1:B+树索引的优势?索引插入怎么创建的 https://blog.csdn.net/wtl666_6/article/details/127954592
✅ 核心答案:
结构:多路平衡树,叶子节点存储数据并形成链表。
优势:①范围查询高效;②减少磁盘I/O(层数低);③适合排序与分组。
Q2:事务ACID特性及隔离级别?事务实现方式->ReadView https://blog.csdn.net/wtl666_6/article/details/128006161
✅ 核心答案:
ACID:原子性(Undo Log)、一致性、隔离性(锁/MVCC)、持久性(Redo Log)。
隔离级别:读未提交→读提交→可重复读(MySQL默认)→串行化,级别越高并发越低。
6. 项目 + 常用工具
QQ:git rebase和merge的区别?如何解决冲突? reset干嘛用的 cherypick呢
✅ 核心答案:
merge:保留分支历史,生成合并节点。
rebase:变基,将当前分支提交“嫁接”到目标分支,形成线性历史。
冲突解决:手动修改冲突文件→git add→git rebase --continue。
总结:问题覆盖候选人技术栈,答案需结合简历中提到的技术关键词(如CGI、epoll、生产消费模型等),突出实际应用能力与原理理解深度。
Q1:HTTP服务器如何实现高并发?线程池如何设计?了解webbech压测工具 压测了吗?
✅ 核心答案:
线程池:预创建线程处理任务,避免频繁创建销毁开销。
关键技术:任务队列、互斥锁、条件变量(生产者-消费者模型),设置最大线程数防止资源耗尽。
Q2:WebSocket在五子棋项目中如何实现实时通信?
✅ 核心答案:
协议升级:HTTP握手后切换为WebSocket(Upgrade: websocket)。
全双工通信:服务端主动推送棋局状态,使用WebSocket++库处理帧数据。
数据格式:JSON封装落子坐标、玩家状态,通过心跳包保活连接。
QQ: AI衍射