Skip to content

得物算法工程师 C++ 秋招线上笔试复盘 ​

面试官提问清单 ​

技术单选题 ​

录屏从技术题第 4 题开始,前 3 题没有题干或作答画面。技术区共 25 题,以下按录屏中出现的题目主题整理:

  1. mmap 顺序扫描和预取导致热数据被挤出时如何调整。
  2. ResNet-18 的网络层数与残差结构。
  3. C++ RAII 对象的构造、析构顺序。
  4. WebRTC 穿越 NAT 所需的 STUN/TURN 角色。
  5. Linux 新建文件和目录的默认权限及 umask。
  6. 联合分布给定时判断两个随机变量是否独立。
  7. 单样本 t 检验的 p 值与显著性结论。
  8. Python 元组中嵌套可变列表的修改。
  9. auto* 从指针初始化时的类型推导。
  10. MSD 基数排序的中间结果。
  11. 领域模型对合法状态和值域的约束。
  12. 二叉搜索树查找路径。
  13. 二分查找的比较次数。
  14. SFTP 与 SCP 的能力差异。
  15. 复合候选键在成绩记录中的建模。
  16. 用于增强图像语义表示的预训练任务。
  17. C++ 私有成员访问的编译错误。
  18. 窗口排序中并列名次的处理。
  19. COUNT(*)、COUNT(column) 与 COUNT(DISTINCT column)。
  20. 曲面与平面法向量平行时的切点计算。
  21. Bellman-Ford 对不可达负环的处理及最短路。

AI Coding ​

实现一个纯内存 HTTP 后端,维护用户、实体、鉴定报告、防伪凭证、所有权转移、扫码申报、克隆风险冻结、业务许可和审计事件等状态,并保证失败重试、幂等、过期、并发和跨实体查询的一致性。

判定范围与结论 ​

统一复核口径:本页现在以题干、选项含义、计算过程和可复用知识为中心;实际勾选只作录屏证据附注。原视频当前不在工作区,无法从关键帧稳定恢复的最终选项不再作为判断依据。

  • 录屏未包含技术题第 1~3 题,无法复核。
  • 技术题第 4~25 题均能看到题干;但第 15、16、23 题在现有采样帧中没有稳定的最终选项高亮,只能给出参考答案,不能把鼠标悬停或瞬时画面当成提交答案。
  • 客观题区完成并提交;按题面独立推导,确认 9 道明确错误:第 4、5、7、8、9、11、17、18、24 题。若每题 2 分,明确可见的损失约 18 分;这不是官方得分。
  • AI Coding 录屏结束时仍停留在编辑器,提交本题型 未点击,也没有判题结果。末段先出现 domain.cpp 多余右括号导致编译失败,修正后又出现样例请求缺少幂等键而返回 HTTP 400;因此不能评价该题得分或声称已完成。

题目与选项复核清单 ​

以下是录屏可见技术题的统一知识化索引;“参考答案”是依据完整题干和选项语义独立推导,不再把临时高亮当成作答结论。第 15、16、23 题的最终勾选画面不稳定,但题目本身仍给出参考答案。

题号题目与选项判断要点参考答案
4mmap 顺序扫描遇到热数据被挤出:继续扩大预取、缩小窗口、关闭缓存、随机读取等方案比较限制预取窗口并保护工作集
5ResNet-18 层数口径、残差连接、下采样、1×1 投影捷径等陈述判断“18 个卷积层”这一说法不严谨/错误
6RAII 资源对象的生命周期资源绑定对象生命周期,异常路径也能自动释放
7C++ 基类/成员构造析构顺序构造按基类和成员声明顺序,析构完全反向
8WebRTC NAT 穿透角色:SIP、STUN、TURN、ICESTUN 发现映射,TURN 中继,ICE 收集并择优
9Linux 文件/目录默认权限与 umask,root 是否例外文件基础权限 0666,目录 0777,再应用 umask
10联合分布和边缘分布判断独立性检查 P(X=x,Y=y)=P(X=x)P(Y=y)
11单样本 t 检验 p 值与显著性p>0.05 不能拒绝原假设
12Python 元组嵌套列表的 extend元组不可改槽位,但内部列表可变
13auto* 从 int* 初始化的推导auto 推导为 int,变量类型为 int*
14MSD 基数排序中间结果先按高位稳定分桶,再在桶内处理低位
15领域模型和值域约束领域模型约束实体合法状态和值域
16二叉搜索树查找路径按比较结果逐层向左/右,路径取决于树结构
17二分查找比较次数先固定闭区间/半开区间,再逐次记录 mid
18SFTP 与 SCP 能力差异SFTP 支持更完整远程文件操作;SCP 主要是复制
19复合候选键表示学生—课程唯一成绩(student_id, course_id)
20预训练增强图像语义的任务对比学习等能拉近正样本、拉远负样本
21C++ 私有成员访问类外直接访问 private 成员会编译错误
22窗口排名并列处理使用并列排名规则,明确是否跳号
23COUNT(*)、COUNT(score)、COUNT(DISTINCT score)分别统计行数、非 NULL 数、非 NULL 去重数
24曲面法向量与平面法向量平行梯度与平面法向量成比例,再代回曲面方程
25Bellman-Ford 与不可达负环只从 dist[u] != ∞ 的可达边开始松弛

第 1~3 题未出现在录屏中,不能补猜;题号 15、16、23 的参考答案可用于复习,但不声称录屏中选择了对应选项。

明确错题 ​

题号录屏可见的最终选择参考答案错因
4A:扩大顺序读块和预取跨度D:限制预取窗口并保护当前工作集顺序预取过大时会把仍有复用价值的热页挤出缓存;应缩小预取窗口、保护工作集,而不是继续放大预取。
5D:用 1×1 卷积解决维度不匹配C:ResNet-18 有 18 个卷积层“18”是网络总层数(通常含最后的全连接层),不是 18 个卷积层;1×1 投影捷径、下采样和残差连接的其余描述成立。原始 ResNet 论文给出了 18 层网络及残差重构思想,见 Deep Residual Learning for Image Recognition。
7A:base → sensor → cache → module → ...B:构造 base → sensor → cache → module,析构反向进行派生类构造先构造基类,再按成员声明顺序构造成员;析构严格反向。题目给出的关闭顺序应为 module → cache → sensor → base。
8C:SIP 服务器负责 NAT 穿透B:STUN/TURNSTUN 用于发现公网映射地址,直连失败时 TURN 中继媒体;SIP 信令服务器不是 NAT 穿透的核心机制。
9B:root 创建的目录不受 umask 影响C:普通文件默认最大权限为 0666umask 会从创建权限中屏蔽位;普通文件基础权限是 0666(不带执行位),目录基础权限是 0777。root 并不会天然绕过这一规则。
11A:p=0.6418 大于 0.05,说明有显著差异B:p>0.05,不能拒绝原假设在常用显著性水平 0.05 下,p 值大于阈值只能说明证据不足,不能宣称统计显著。
17B:3 次比较A:4 次比较mid=(left+right)//2 且右边界取 n 时,目标 20 的比较序列为 19、31、27、23,随后区间为空,共 4 次。
18C:SFTP 基于 FTP,SCP 支持远程删除和建目录D:SCP 不提供远程删除/建目录,SFTP 提供SFTP 是基于 SSH 的文件传输协议,支持较完整的远程文件操作;SCP 主要是安全复制,远程目录管理能力有限。
24A:(-3/2, 3/2, 7/2)C:(3/2, 3/2, 9/2)曲面 z=9-x²-y² 的法向量可取 (2x,2y,1);与平面法向量 (3,3,1) 平行要求 x=y=3/2,代回得到 z=9/2。

参考答案与核对状态 ​

题号参考答案录屏核对
6C选择正确
10A选择正确
12B选择正确
13A选择正确
14D选择正确
15B最终选项未稳定确认
16A最终选项未稳定确认
19A选择正确
20B选择正确
21B选择正确
22C选择正确
23D最终选项未稳定确认
25B选择正确

第 1~3 题属于视频缺失范围,不能补猜答案。

知识点回顾 ​

缓存预取与工作集 ​

顺序扫描适合预取,但预取窗口过大可能产生缓存污染:尚未访问的数据提前占据缓存,挤出近期仍会复用的热页。调优时同时观察命中率、缺页/IO、预取命中率和工作集大小;常见方向是限制预取距离、分离扫描流与热数据、必要时降低扫描对缓存的占用。

ResNet 层数口径 ​

“ResNet-18”表示按论文约定统计的总层数,不等于 18 个卷积层。判断选项时先确认统计口径:卷积层、全连接层是否都计入,池化和激活通常不计入。残差块通过捷径把输入与变换结果相加,维度变化时可用投影捷径(例如 1×1 卷积)对齐。

C++ 构造与析构顺序 ​

顺序固定为:虚基类、直接基类、成员(按声明顺序)、派生类构造体;析构完全反向。初始化列表的书写顺序不能改变成员的实际构造顺序,因此成员声明顺序本身就是资源依赖顺序的一部分。

WebRTC NAT 穿透 ​

ICE 会收集候选地址并择优连通:主机候选、STUN 得到的服务器反射候选,以及 TURN 中继候选。STUN 解决“我在公网看起来是什么地址”,TURN 解决“双方无法直连时由服务器转发媒体”;SIP 只负责信令协商时不能替代这两者。

umask 与默认权限 ​

创建权限可记为:

text
文件:0666 & ~umask
目录:0777 & ~umask

文件默认不带执行位;最终权限还会受到程序传入 mode 和系统实现影响,但 root 身份不是“忽略 umask”的通用条件。

p 值与显著性 ​

先固定原假设、备择假设和显著性水平 α,再比较 p 与 α:p≤α 时拒绝原假设;p>α 时不能拒绝原假设。统计“不显著”不等于证明两者完全相同,也不等于证明原假设为真。

稳定排序、二分与基数排序 ​

  • MSD 基数排序按高位分桶并递归/继续处理桶内低位;桶内通常保持稳定。先写出每一轮分桶结果,再在对应桶内继续排序。
  • 二分查找必须明确区间是 [left,right) 还是 [left,right]。本题右边界为 n,每次比较后记录 mid 对应元素,再更新区间,直到 left>=right。

SQL 聚合计数 ​

COUNT(*) 统计行数,COUNT(column) 忽略该列 NULL,COUNT(DISTINCT column) 先去重再计数。题目中 8 行、3 个 NULL、5 个非空值且只有一对重复时,三者分别为 8、5、4。

曲面法向量 ​

把隐式曲面写成 F(x,y,z)=0,梯度 ∇F 是法向量。对 z=9-x²-y² 可写为 F=x²+y²+z-9,所以法向量为 (2x,2y,1);“平行”应按比例比较三个分量并代回曲面方程验算。

Bellman-Ford 与不可达负环 ​

松弛边时先判断 dist[u] 是否为无穷大。不可达分量中的负环不会影响从源点可达的最短路;只有在源点可达且还能继续松弛时,才报告负环。此题到目标的最短路径为 S→B→A→C→T,长度 6。

AI Coding 复盘 ​

录屏事实 ​

  • 本地自测曾显示幂等、许可过期/转移、多个冻结、重认证、枚举校验、版本条件和审计序列等若干用例通过。
  • 随后编译因 handle_unlock_owner(parts[1])); 多一个右括号失败;修正后,样例脚本请求所有者接口时仍因缺少 Idempotency-Key 返回 HTTP 400。
  • 录屏结束时没有点击“提交本题型”,没有官方判题结果,因此只能评价验证过程,不能评价最终得分。

应保留的实现检查表 ​

  1. 先过编译门禁:每次修改后先执行完整构建,再运行样例和自测;编译失败时不要把之前的通过日志当作当前版本证据。
  2. 对齐 HTTP 合约:GET 查询参数必须放在 URL;要求幂等的 POST 必须在测试请求中显式携带 Idempotency-Key,并验证相同 key 重放返回同一业务结果而不重复写入。
  3. 状态转移原子性:所有权代次、凭证替换、风险冻结、审计事件应在同一事务边界内更新;失败、超时、重复请求都要保持不变量。
  4. 并发与隔离测试:对同一实体的并发转移、扫码和冻结做压力/竞态测试,检查是否出现双重成功、代次回退、分支状态互相污染。
  5. 测试契约可审计:样例脚本、路由实现和错误码定义必须来自同一份接口契约;若测试预期与服务端约束冲突,应先修正测试输入或明确题目要求,再判断实现是否正确。

关联专题 ​

本次回答中需要改进的地方 ​

客观题 ​

  • 缓存题:把“顺序访问”简单等同于“预取越大越好”,忽略了热工作集被污染的代价。
  • 深度学习题:没有核对 ResNet 的层数统计口径,把总层数误读成卷积层数量。
  • C++ 生命周期题:没有按“基类—成员声明顺序—派生类,再完全反向”逐项展开,导致构造/析构顺序选反。
  • 网络与权限题:把 SIP 当成 NAT 穿透协议,并把 root 身份当成绕过 umask 的条件;应先按协议职责和权限公式排除干扰项。
  • 统计题:将“p>0.05”误读为“差异显著”,需要固定显著性检验的拒绝规则。
  • 二分题:没有记录每次 mid 和新区间,比较次数少算一次。
  • 文件传输题:混淆 SFTP 与 SCP 的远程操作能力,答题前应按 SSH 子系统/安全复制的定位区分。
  • 向量法向量题:列出平行条件后未代回曲面方程复核 z 坐标,且 x 的符号判断错误。

AI Coding ​

  • 没有在提交前完成“构建成功 → 样例全通过 → 幂等/并发关键用例通过”的闭环。
  • 修改测试请求后仍未核对服务端必填请求头,导致把接口契约错误暴露为 HTTP 400;后续应把请求方法、URL 查询、请求头、错误码逐项对照 README/路由定义。
  • 录屏结束前未提交题型,导致没有官方判分证据。时间不足时应先保住可编译主路径,再提交一个可审计版本,并记录未覆盖的边界。

使用 Markdown 与 VitePress 构建