2026-04-18 16:42:22
算法题:合并两个有序数组(使用快排)
关键点:题目要求用快排实现,但实际合并有序数组更高效的方式是双指针法(时间复杂度O(m+n))。若强行用快排,需先合并数组再排序,时间复杂度为O((m+n)log(m+n)),不符合最优解预期。
第K大数:可通过快速选择算法(Quickselect)实现,平均时间复杂度O(n),最差O(n2)(当每次分区极不均衡时)。若未答出,可补充:快排最优时间复杂度O(nlogn),最差O(n2)(分区不平衡时)。
项目问题:写入数据冲突保障
常见方案:
数据库层面:使用事务(ACID特性)、唯一索引、乐观锁/悲观锁。
分布式系统:分布式锁(如Redis实现)、CAS(Compare-And-Swap)操作。
代码层面:加锁(互斥锁、读写锁)、消息队列串行化写入。
C++基础
数组与动态数组区别:
int a[10]:静态分配,栈内存,大小固定,生命周期随作用域结束。
int *a = new int[10]:动态分配,堆内存,需手动释放(delete[]),大小灵活。
C++11新特性:
智能指针(shared_ptr、unique_ptr)、自动类型推导(auto)、范围for循环、lambda表达式、右值引用与移动语义。
容器使用:
序列容器:vector(动态数组)、list(双向链表)、deque(双端队列)。
关联容器:map/unordered_map(红黑树/哈希表实现)、set。
容器适配器:stack、queue、priority_queue。
多态与指针/引用
静态多态:编译时确定(函数重载、模板)。
动态多态:运行时确定(虚函数、继承)。
指针与引用区别:
指针可重新绑定、可为空、需解引用;引用必须初始化、不可更改绑定、无需解引用。
计算机网络
TIME_WAIT作用:
确保最后一个ACK到达对端,避免旧连接重复分组干扰新连接。
通常持续2MSL(最大报文生存时间),保证网络中残留数据包失效。
HTTPS与HTTP差异:
HTTPS在HTTP基础上加入SSL/TLS加密,端口443,需CA证书,安全性更高。
TCP拥塞控制:
慢启动、拥塞避免、快速重传、快速恢复。
I/O多路复用:
select:支持多文件描述符,但需遍历、有数量限制(1024)。
poll:无数量限制,但仍需遍历。
epoll:Linux特有,基于事件回调,高效处理大量连接(ET/LT模式)。
数据库
乐观锁与悲观锁:
乐观锁:假设无冲突,通过版本号/CAS实现(如MySQL的WHERE version = old_version)。
悲观锁:直接加锁(如SELECT FOR UPDATE)。
索引优化:
使用EXPLAIN分析执行计划,关注type(如ALL全表扫描需优化)、key(是否用索引)、rows(扫描行数)。
主从同步:
基于binlog复制,主库记录变更到binlog,从库通过I/O线程拉取、SQL线程重放。
需注意主从延迟问题(如网络延迟、大事务)。
Redis
缓存问题:
击穿:热点key过期时大量请求直达DB,可用互斥锁或永不过期策略。
穿透:查询不存在的key,可用布隆过滤器或缓存空值。
雪崩:大量key同时过期,可设置随机过期时间或分层缓存。
性能原因:
内存存储、单线程避免锁竞争、高效数据结构(如跳表、压缩列表)。
操作系统
进程与线程:
进程是资源分配单位,线程是CPU调度单位;进程间通信需IPC,线程间共享进程内存。
常用命令:
find(文件搜索)、ps(进程查看)、vim(文本编辑)、top(实时系统监控)。
项目深度
spdlog vs glog:
spdlog是C++高性能日志库,支持异步日志、多线程安全、格式化灵活;glog是Google的日志库,功能全面但性能稍弱。
异步写入资源问题:
需考虑线程池大小、队列积压、磁盘I/O瓶颈,可通过限流、熔断机制保障稳定性。
高可用方案:
冗余部署(主从、集群)、故障自动转移、健康检查、负载均衡。
场景题
服务异常处理:
需结合监控告警、日志分析、链路追踪定位问题,例如通过top/htop查看资源占用,netstat检查网络连接。
性能优化:
从代码(算法优化)、系统(内核参数调优)、架构(缓存、异步)多层面分析。
技术广度
Golang:
腾讯音乐后台可能用Golang开发高并发服务,需了解其goroutine、channel、GC机制。
Redis版本:
常见版本如5.0(支持Stream数据结构)、6.0(多线程IO),需熟悉特性差异。