手写与纸上推演题

共 19 题
#

1. 手写位运算,判断 2 的幂、统计 1 的个数(Brian Kernighan)、交换两数如何实现?

A n & (n-1) 用于统计 1 的个数,循环次数为比特位数
B 判断 2 的幂需要额外临时变量
C 异或交换可以在同一变量上安全使用
D n & (n-1)==0 可判断 2 的幂,Brian Kernighan 每次去掉最低位 1、循环次数等于 1 的个数,异或交换在相同变量时出错 ✓ 正确答案
#

2. 手写一个基于 free list 的 first-fit 内存分配器,分配与释放时如何处理相邻块合并与碎片?

A 释放时无需合并相邻空闲块
B free list 无法产生外部碎片
C 边界标记只用于分配不用于释放
D first-fit 从头遍历找第一个够大的块并切分,释放时用边界标记检查邻居并合并;外部碎片靠合并缓解,边界标记使合并 O(1) ✓ 正确答案
#

3. 纸上推演 Raft 选举,给定节点数与随机超时,推演选票分裂、term 递增与旧 leader 网络恢复后的日志复制异常?

A 随机超时用于提高选票分裂概率
B 同一 term 允许多个 leader
C 旧 leader 恢复后仍可继续提交日志
D 随机化超时避免选票分裂,term 递增保证唯一 leader;旧 leader 恢复后 term 落后自动降级,其未提交日志被新 leader 覆盖修正 ✓ 正确答案
#

4. 纸上推演一个多级页表的地址翻译过程(含 TLB 未命中)?

A TLB 未命中时只需一次内存访问
B 多级页表与 TLB 无关
C 多级页表节省内存,TLB 命中时一次访存,未命中时需逐级访问页表(甚至触发缺页),TLB 命中率是关键 ✓ 正确答案
D 页表翻译不需要页内偏移
#

5. 推演 TCP 三次握手与四次挥手的完整状态机(含异常场景)?

A 服务端握手时先进入 ESTABLISHED 再回 SYN+ACK
B 三次握手建立连接(SYN/SYN+ACK/ACK),四次挥手关闭(FIN/ACK/FIN/ACK),TIME_WAIT 用于保证旧报文消失与 ACK 可重传,SYN 洪泛可打满半连接队列 ✓ 正确答案
C 关闭连接只需一次 FIN
D TIME_WAIT 由被动关闭方进入
#

6. 手写一个无锁栈(Treiber 栈)并说明 ABA 问题与解决?

A Treiber 栈用加锁实现 push/pop
B Treiber 栈用 CAS 循环实现,ABA 是值变回原样导致 CAS 误判,可用版本号/AtomicStampedReference 或 hazard pointer 解决 ✓ 正确答案
C ABA 问题通过加锁可以完美解决
D CAS 无需重试
#

7. 纸上推演 LRU 缓存,给出访问序列,手动模拟哈希表+双向链表的淘汰过程?

A LRU 淘汰最近使用的节点
B LRU 只需哈希表即可
C LRU 用哈希表 O(1) 查找 + 双向链表维护访问顺序,访问时移到头部、满时淘汰尾部,即可模拟淘汰过程 ✓ 正确答案
D LRU 不需要记录访问顺序
#

8. 手写生产者-消费者(信号量/Park-Unpark)并推演竞争时序?

A 生产者-消费者需空/满信号量控制容量,判断与操作要在临界区内原子完成,避免丢失唤醒 ✓ 正确答案
B 判断队列满/空与操作不需要在临界区内
C Park-Unpark 不会出现丢失唤醒
D 生产者消费者无需互斥
#

9. 手写快速排序与归并排序,稳定性与空间复杂度如何对比?

A 快排是稳定的
B 归并空间复杂度 O(1)
C 快排平均 O(n log n)、不稳定、空间 O(log n);归并稳定、时间固定 O(n log n)、空间 O(n) ✓ 正确答案
D 快排最坏也是 O(n log n)
#

10. 手写一个固定大小线程池,任务队列、工作线程与关闭语义如何设计?

A 关闭时无需处理队列中的任务
B 关闭语义与线程池无关
C 工作线程在队列空时自旋不等待
D 线程池由任务队列+固定工作线程组成,优雅关闭需排空队列并唤醒阻塞线程,强制关闭则中断清空 ✓ 正确答案
#

11. 纸上推演 LFU 缓存(LeetCode 460),给定访问序列,手动模拟频率计数与淘汰过程?

A LFU 淘汰最近使用的项
B LFU 不需要记录频次
C LFU 与 LRU 淘汰策略相同
D LFU 优先淘汰访问频次最低的项,频次相同时淘汰最久未用的(LRU 兜底),需跟踪每个 key 的频率 ✓ 正确答案
#

12. 手写一致性哈希并推演节点增减时的数据迁移范围?

A 节点增减时所有数据都要迁移
B 虚拟节点会增加迁移量
C 一致性哈希不需要哈希环
D 一致性哈希把节点和数据映射到哈希环,上新/删除节点只迁移受影响环段(约 1/n 数据),虚拟节点用于均衡分布 ✓ 正确答案
#

13. 纸上推演 TCP 状态机与页面置换?

A TCP 状态机跟踪连接状态转移,页面置换按 FIFO/LRU/OPT 规则淘汰页;FIFO 可能出现 Belady 异常,LRU/OPT 不会 ✓ 正确答案
B FIFO 与 LRU 的淘汰规则相同
C OPT 可以实际实现
D 页面置换与缺页率无关
#

14. 手写二分查找,边界与死循环的坑如何避开?

A mid 用 low+high 计算更安全
B 二分查找不会有死循环
C 需用 low+(high-low)/2 防溢出,且保证每次循环 low/high 至少移动一位避免死循环,边界选择要与 mid±1 配套 ✓ 正确答案
D 边界条件不影响结果
#

15. 手写 LRU 与 LFU,淘汰策略如何权衡?

A LRU 按最近访问淘汰、对局部性友好但对突发敏感;LFU 按频率淘汰、能抗突发但新热点升温慢,需频率衰减 ✓ 正确答案
B LRU 适合长期稳定热点,LFU 适合突发访问
C 两种策略完全等价
D LFU 对突发访问更敏感
#

16. 手写 SPSC 无锁环形队列,head/tail 索引与 release/acquire 语义,如何避免 cache line 假共享?

A SPSC 需要锁保护共享索引
B SPSC 单生产者单写 head/tail、单消费者单读,用 release/acquire 内存序保证数据可见性顺序,并用 padding 隔离 head/tail 避免假共享 ✓ 正确答案
C release/acquire 与数据可见性无关
D 假共享不影响性能
#

17. 手写 Top-K,基于堆与快速选择的两种实现,时间/空间复杂度与适用场景如何?

A 堆实现空间 O(n)
B 堆实现 O(n log K)、空间 O(K)、适合数据流;快速选择平均 O(n)、最坏 O(n^2)、适合静态全量数据 ✓ 正确答案
C 快速选择空间 O(n)
D 两种实现复杂度完全相同
#

18. 纸上推演磁盘调度,给定磁道请求序列与磁头初始位置,分别计算 FCFS、SSTF、SCAN、C-SCAN 的总寻道距离,并说明 SSTF 为何可能饥饿、C-SCAN 为何等待时间更均匀?

A FCFS 寻道距离最短
B SSTF 平均寻道短但可能饥饿;SCAN 双向扫描;C-SCAN 单向循环使等待更均匀;FCFS 按到达顺序但寻道距离大 ✓ 正确答案
C C-SCAN 比 SSTF 更容易饥饿
D SCAN 两端请求等待必定最短
#

19. 纸上推演令牌桶限流,给定速率与容量,推演突发流量下令牌消耗与补充的过程?

A 令牌桶以速率 r 补充、容量 b 封顶,突发流量下最多连续放行 b 个请求,长期平均速率不超 r ✓ 正确答案
B 令牌桶不允许任何突发
C 令牌桶容量无限
D 令牌桶补充没有任何上限