面灵AI→

招银网络科技 C++ 开发一面面经

轮次
一面
时间
2026-10
来源
牛客网

《面试题目》

  1. 请做一下自我介绍。
  2. 项目是自己玩的,还是实验室的?项目的级别是什么?
  3. C++ 基本数据类型有哪些?
  4. 解释一下面向对象编程中继承的概念。
  5. 怎么使用 C++ 容器进行高效存储和访问数据?
  6. 多线程如何保证共享数据的安全访问?
  7. 描述一种常见的设计模式及其应用场景。
  8. 如何优化内存分配以提升程序性能?
  9. 解释一下缓存机制在系统中的作用,Redis 的缓存击穿、缓存穿透、缓存雪崩分别是什么?
  10. 如何在分布式系统中实现任务调度以提升效率?
  11. 解释一下什么是长期记忆,并说明它在 AI 系统中的重要性。
  12. 长期记忆的实现方式有哪些?
  13. 如何设计高性能问答系统来满足复杂的用户需求?
  14. 手写代码:如何求最大连续子数组和?

《参考解析》

容器选型看访问模式,不是看谁「快」。 vector 连续内存、随机访问 O(1)、尾部插入摊还 O(1),中间插入要搬数据;deque 分段连续,头尾插入都是 O(1);list / forward_list 是链表,插入删除 O(1) 但访问 O(n),且节点分散导致缓存命中差;unordered_map 哈希平均 O(1),代价是 rehash 抖动、迭代器可能失效、内存开销大;map 是红黑树,O(log n) 但有序,适合区间遍历。工程结论:读多写少要随机访问就用 vector 并 reserve 预留;按 key 查不要顺序就用 unordered_map;要按范围遍历用 map;元素大或拷贝贵就存指针、用 emplace_back 原地构造,别 push_back 一个临时对象。

多线程共享数据:先分清是「互斥」还是「同步」。 互斥用 std::mutex 配 lock_guard / unique_lock,注意锁粒度和统一的加锁顺序来避免死锁,能用 scoped_lock 一次锁多把更好;读多写少用 C++17 的 shared_mutex;简单计数、标志位用 std::atomic 走无锁路径;「等条件成立」用 condition_variable,并且必须配谓词循环判断以防虚假唤醒。要额外说清可见性和指令重排——volatile 不提供任何同步语义,跨线程共享就别用它。thread_local 解决的是线程私有数据,和共享数据安全是两回事。

缓存三兄弟的触发条件和处方完全不同。 穿透是查一个数据库里也不存在的数据,缓存永远不命中,请求全部落到 DB,处方是布隆过滤器拦掉不存在的 key,或缓存空值但给很短的 TTL。击穿是某个热点 key 到期的那一瞬间大量并发同时回源,处方是互斥重建(分布式锁,只放一个请求去查库)或逻辑过期(缓存不设物理 TTL,异步线程刷新)。雪崩是大量 key 在同一时刻集中失效,或者缓存节点整体故障,处方是 TTL 加随机抖动打散、多级缓存兜底、集群高可用,再配限流和降级——缓存全挂时至少要保证数据库不被压垮。

最大连续子数组和就是 Kadane 的一遍扫描。 定义 f[i] 为「以 i 结尾的最大子数组和」,转移是 f[i] = max(f[i-1] + a[i], a[i]),答案是所有 f[i] 的最大值,用两个滚动变量就能做到 O(n) 时间、O(1) 空间。两个细节最容易扣分:初值要取 a[0] 而不是 0,否则全负数组会算成 0;如果要返回区间下标,就要在更新 best 时同时记下当前片段的起止。被问「有环怎么办」的变体时,思路是「最大子数组和 = max(不跨越边界的最大子段和, 总和 - 最小子段和)」,注意全负数要单独处理。

长期记忆要答成一套链路而不是一个存储。 它在 AI 系统里解决两个硬约束:上下文窗口有限,装不下全部历史;跨会话要有一致的用户画像和事实。工程上通常是三段式——写入侧从对话里抽取事实、偏好、事件并做去重与冲突消解(新事实覆盖旧事实要带时间戳和来源);存储侧用向量库存语义片段、KV 存精确事实、必要时加事件图谱描述关系;读取侧按当前问题做混合检索(向量召回 + 关键词 + 时间衰减),再做重排和压缩后塞进 prompt。常见的坑是只做向量检索:相似不等于相关,且没有遗忘机制时旧记忆会长期污染回答,所以还要有 TTL、置信度和优先级。

高性能问答系统的瓶颈通常不在模型,在检索和一致性。 设计时先拆路径:问题理解(意图分类、改写、多轮指代消解)→ 检索(结构化过滤 + 向量召回 + 重排)→ 生成(流式输出、引用溯源)→ 后处理(敏感词、置信度兜底转人工)。性能上要做三件事:把召回结果做缓存(FAQ 类问题直接命中缓存走模板)、把可并行化的检索并发发出并设超时降级、把长链路做成流式首包返回而不是等全量生成。可靠性上要有「检索不到就明确说不知道」和答案可溯源,否则在业务问答里幻觉的代价会远高于慢一点。