以下是计算机专业求职面试的常见题目分类整理,每个大类精选20道高频问题,结合参考内容进行解析与扩展,帮助系统化备考:
一、数据结构与算法
- 解释时间复杂度和空间复杂度
- 时间复杂度衡量算法执行时间随输入规模的增长趋势(如O(n));空间复杂度衡量算法所需额外内存(如O(1))。需结合具体算法举例说明。
- 深度优先搜索(DFS)与广度优先搜索(BFS)的区别
- DFS通过递归或栈实现,适合路径搜索、拓扑排序;BFS通过队列实现,适合最短路径问题。
- 栈与队列的特点及应用场景
- 栈(LIFO):函数调用、括号匹配;队列(FIFO):任务调度、缓冲区管理。
- 二分查找的实现与时间复杂度
- 递归与非递归实现,时间复杂度O(logn),需数组有序。
- 快速排序与归并排序的核心思想
- 快排:分治+基准值划分;归并:分治+合并有序子数组。
- 二叉树遍历的三种方式(前序、中序、后序)
- 前序:根→左→右;中序:左→根→右;后序:左→右→根。
- 哈希表的冲突解决方法
- 开放寻址法、链地址法、再哈希法。
- 动态规划的核心思想
- 将问题分解为子问题,通过记忆化存储中间结果(如背包问题)。
- 红黑树与AVL树的区别
- 红黑树通过颜色标记保持近似平衡,插入/删除效率更高;AVL树严格平衡,查询更快。
- LRU缓存实现原理
- 使用哈希表+双向链表,保证O(1)的插入和删除。
- 堆的结构与堆排序步骤
- 完全二叉树,最大堆/最小堆;堆排序步骤:建堆→交换堆顶元素→调整堆。
- 图的表示方法(邻接矩阵 vs 邻接表)
- 邻接矩阵适合稠密图,空间O(n²);邻接表适合稀疏图,空间O(n+e)。
- KMP算法原理
- 通过部分匹配表跳过无效字符匹配,时间复杂度O(n+m)。
- 贪心算法的适用场景
- 局部最优解能推导全局最优的问题(如霍夫曼编码)。
- 反转链表的实现
- 迭代法(三指针)或递归法。
- Top K问题的解决方案
- 堆排序(O(nlogk))或快速选择算法(O(n))。
- 并查集的实现与应用
- 路径压缩+按秩合并,用于连通性检测。
- 布隆过滤器的原理与优缺点
- 位数组+多个哈希函数,空间效率高但存在误判率。
- 判断链表是否有环
- 快慢指针法(Floyd判圈算法)。
- 最小生成树算法(Prim vs Kruskal)
- Prim基于顶点扩展,适合稠密图;Kruskal基于边排序,适合稀疏图。
二、操作系统
- 进程与线程的区别
- 进程是资源分配单位,线程是CPU调度单位;线程共享进程内存,切换开销更小。
- 死锁的四个必要条件
- 互斥、请求与保持、不可剥夺、循环等待。
- 虚拟内存的作用与实现
- 通过分页/分段机制扩展内存空间,支持页面置换算法(LRU、FIFO)。
- 用户态与内核态切换的触发条件
- 系统调用、中断、异常。
- 进程间通信方式
- 管道、消息队列、共享内存、信号量、Socket。
- 线程同步机制
- 互斥锁、条件变量、信号量、读写锁。
- 页面置换算法比较
- 最优置换(理论)、LRU(最近最少使用)、FIFO(可能Belady异常)。
- 孤儿进程与僵尸进程
- 孤儿进程由init进程接管;僵尸进程需父进程调用wait()回收。
- CPU调度算法(FCFS、SJF、RR)
- 先来先服务、短作业优先、时间片轮转。
- 文件系统结构(inode vs FAT)
- inode存储文件元数据;FAT通过链表管理文件块。
- DMA的作用
- 允许外设直接访问内存,减少CPU中断开销。
- 中断处理流程
- 保存现场→执行中断服务程序→恢复现场。
- 多级反馈队列调度原理
- 动态调整进程优先级,兼顾响应时间和吞吐量。
- 同步与异步IO的区别
- 同步IO阻塞进程,异步IO通过回调通知。
- 内存碎片问题
- 内部碎片(分配单元未用完)、外部碎片(空闲内存不连续)。
- 软链接与硬链接的区别
- 硬链接指向inode,删除原文件不影响;软链接是路径指针。
- 缓冲区溢出攻击原理
- 输入数据超出缓冲区大小,覆盖返回地址执行恶意代码。
- 自旋锁与互斥锁适用场景
- 自旋锁(短等待,CPU忙等);互斥锁(长等待,线程休眠)。
- 系统调用执行流程
- 用户态→软中断→内核态执行→返回结果。
- 零拷贝技术原理
- 减少数据在内核与用户空间的拷贝次数(如mmap、sendfile)。
三、计算机网络
- HTTP状态码(200、301、404、500)
- 200成功;301永久重定向;404资源未找到;500服务器内部错误。
- TCP三次握手与四次挥手
- 握手:SYN→SYN-ACK→ACK;挥手:FIN→ACK→FIN→ACK。
- HTTP与HTTPS的区别
- HTTPS=HTTP+SSL/TLS,加密传输,端口443,需CA证书。
- DNS解析过程
- 浏览器缓存→系统缓存→路由器→ISP→递归查询根域→权威DNS。
- TCP粘包与拆包问题
- 固定长度、分隔符、长度字段标识消息边界。
- Cookie与Session的区别
- Cookie存储在客户端,Session存储在服务端,依赖Session ID。
- 对称加密与非对称加密的应用场景
- 对称加密(AES)用于数据传输;非对称加密(RSA)用于密钥交换。
- GET与POST的区别
- GET参数在URL,有长度限制;POST在请求体,支持大数据。
- ARP协议的作用
- 将IP地址解析为MAC地址,通过广播请求单播响应。
- CDN工作原理
- 分布式节点缓存内容,就近返回资源,减少延迟。
- WebSocket协议特点
- 全双工通信,基于HTTP升级,适合实时应用(如聊天室)。
- TCP拥塞控制算法
- 慢启动、拥塞避免、快速重传、快速恢复。
- OSI七层模型与TCP/IP四层模型对比
- 应用层(HTTP)→传输层(TCP)→网络层(IP)→链路层(MAC)。
- HTTPS握手流程
- 客户端Hello→服务器证书→密钥交换→加密通信。
- MTU与MSS的区别
- MTU是链路层最大传输单元;MSS是TCP层有效数据长度。
- NAT类型与穿透方法
- 完全锥形、受限锥形、端口受限锥形;STUN/TURN/ICE协议。
- QUIC协议的优势
- 基于UDP,0-RTT连接,多路复用,前向纠错。
- TIME_WAIT状态的作用
- 确保最后一个ACK到达,防止旧连接数据干扰新连接。
- HTTP长连接与短连接
- 长连接复用TCP连接(HTTP/1.1默认);短连接每次请求新建连接。
- IP分片与重组
- 数据包超过MTU时分片,目标主机根据标识、偏移量重组。
四、数据库
- ACID特性
- 原子性(事务全成功/失败)、一致性(约束保持)、隔离性(并发控制)、持久性(提交后永久保存)。
- 事务隔离级别
- 读未提交→读已提交→可重复读→串行化(解决脏读、不可重复读、幻读)。
- 索引类型(B+树 vs 哈希)
- B+树支持范围查询;哈希适合等值查询,无排序。
- SQL优化方法
- 避免SELECT *、使用索引、减少子查询、分页优化(limit offset)。
- 数据库锁机制(行锁、表锁、间隙锁)
- 行锁粒度小但开销大;间隙锁防止幻读。
- 范式化与反范式化设计
- 范式化减少冗余,反范式化提升查询性能。
- MVCC实现原理
- 多版本并发控制,通过版本链和ReadView实现无锁读。
- 主从复制原理
- 主库写binlog,从库IO线程拉取,SQL线程重放。
- CAP理论
- 一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者不可兼得。
- Redis持久化方式(RDB vs AOF)
- RDB快照恢复快但可能丢数据;AOF日志更安全但文件大。
- 数据库分库分表策略
- 垂直拆分(按业务)、水平拆分(按哈希或范围)。
- 慢查询分析与优化
- 开启慢查询日志,使用EXPLAIN分析执行计划。
- 联合索引的最左匹配原则
- 索引(a,b,c)可匹配a、a,b、a,b,c查询,但无法跳过a。
- InnoDB与MyISAM的区别
- InnoDB支持事务、行锁、外键;MyISAM表锁、全文索引。
- 悲观锁与乐观锁实现
- 悲观锁(SELECT FOR UPDATE);乐观锁(版本号或CAS)。
- 数据库连接池的作用
- 复用连接,减少创建/销毁开销,提升性能。
- SQL注入防御方法
- 预编译语句(PreparedStatement)、输入过滤、最小权限原则。
- 数据库备份策略
- 全量备份+增量备份,定期恢复测试。
- 分布式事务解决方案
- 2PC(两阶段提交)、TCC(补偿事务)、基于消息队列。
- MongoDB与关系型数据库对比
- 文档存储灵活,适合非结构化数据;关系型数据库强一致性。
五、编程语言(C++/Java)
- C++虚函数与多态原理
- 虚函数表(vtable)实现动态绑定,基类指针调用派生类方法。
- 智能指针类型(unique_ptr、shared_ptr、weak_ptr)
- unique_ptr独占所有权;shared_ptr引用计数;weak_ptr解决循环引用。
- Java垃圾回收算法(标记-清除、复制、分代)
- 新生代(复制算法),老年代(标记-整理)。
- C++内存管理(new/delete vs malloc/free)
- new调用构造函数,malloc仅分配内存。
- Java HashMap实现原理
- 数组+链表/红黑树,负载因子触发扩容。
- C++ STL容器对比(vector、list、map)
- vector连续内存随机访问快;list双向链表插入快;map红黑树有序。
- Java线程池参数与工作流程
- corePoolSize、maximumPoolSize、队列类型、拒绝策略。
- C++ lambda表达式捕获方式
- 值捕获([=])、引用捕获([&])、混合捕获([a,&b])。
- Java synchronized与ReentrantLock区别
- synchronized关键字基于JVM;ReentrantLock提供公平锁、条件变量。
- C++模板元编程应用场景
- 编译期计算、类型推导(如STL算法)。
- Java泛型擦除机制
- 编译后类型擦除为Object,通过桥方法保持多态。
- C++移动语义与右值引用
- 避免深拷贝,转移资源所有权(std::move)。
- Java反射机制优缺点
- 动态加载类,破坏封装性,性能较低。
- C++内存对齐原则
- 结构体成员按最大类型大小对齐,减少CPU访问次数。
- Java JVM内存模型(堆、栈、方法区)
- 堆存储对象实例;栈存储局部变量;方法区存储类信息。
- C++设计模式(单例、工厂、观察者)
- 单例模式(懒汉式、饿汉式);工厂模式解耦对象创建。
- Java并发工具类(CountDownLatch、CyclicBarrier)
- CountDownLatch一次性等待;CyclicBarrier可重复使用。
- C++异常处理机制(try/catch/throw)
- 栈展开(stack unwinding),资源通过RAII管理。
- Java注解原理与自定义注解
- 元注解(@Target、@Retention),APT处理注解。
- C++11新特性(auto、范围for、智能指针)
- 类型推导、lambda表达式、右值引用。