Appearance
得物算法工程师 C++ 秋招线上笔试复盘
面试官提问清单
技术单选题
录屏从技术题第 4 题开始,前 3 题没有题干或作答画面。技术区共 25 题,以下按录屏中出现的题目主题整理:
mmap顺序扫描和预取导致热数据被挤出时如何调整。- ResNet-18 的网络层数与残差结构。
- C++ RAII 对象的构造、析构顺序。
- WebRTC 穿越 NAT 所需的 STUN/TURN 角色。
- Linux 新建文件和目录的默认权限及
umask。 - 联合分布给定时判断两个随机变量是否独立。
- 单样本 t 检验的 p 值与显著性结论。
- Python 元组中嵌套可变列表的修改。
auto*从指针初始化时的类型推导。- MSD 基数排序的中间结果。
- 领域模型对合法状态和值域的约束。
- 二叉搜索树查找路径。
- 二分查找的比较次数。
- SFTP 与 SCP 的能力差异。
- 复合候选键在成绩记录中的建模。
- 用于增强图像语义表示的预训练任务。
- C++ 私有成员访问的编译错误。
- 窗口排序中并列名次的处理。
COUNT(*)、COUNT(column)与COUNT(DISTINCT column)。- 曲面与平面法向量平行时的切点计算。
- 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 题的最终勾选画面不稳定,但题目本身仍给出参考答案。
| 题号 | 题目与选项判断要点 | 参考答案 |
|---|---|---|
| 4 | mmap 顺序扫描遇到热数据被挤出:继续扩大预取、缩小窗口、关闭缓存、随机读取等方案比较 | 限制预取窗口并保护工作集 |
| 5 | ResNet-18 层数口径、残差连接、下采样、1×1 投影捷径等陈述判断 | “18 个卷积层”这一说法不严谨/错误 |
| 6 | RAII 资源对象的生命周期 | 资源绑定对象生命周期,异常路径也能自动释放 |
| 7 | C++ 基类/成员构造析构顺序 | 构造按基类和成员声明顺序,析构完全反向 |
| 8 | WebRTC NAT 穿透角色:SIP、STUN、TURN、ICE | STUN 发现映射,TURN 中继,ICE 收集并择优 |
| 9 | Linux 文件/目录默认权限与 umask,root 是否例外 | 文件基础权限 0666,目录 0777,再应用 umask |
| 10 | 联合分布和边缘分布判断独立性 | 检查 P(X=x,Y=y)=P(X=x)P(Y=y) |
| 11 | 单样本 t 检验 p 值与显著性 | p>0.05 不能拒绝原假设 |
| 12 | Python 元组嵌套列表的 extend | 元组不可改槽位,但内部列表可变 |
| 13 | auto* 从 int* 初始化的推导 | auto 推导为 int,变量类型为 int* |
| 14 | MSD 基数排序中间结果 | 先按高位稳定分桶,再在桶内处理低位 |
| 15 | 领域模型和值域约束 | 领域模型约束实体合法状态和值域 |
| 16 | 二叉搜索树查找路径 | 按比较结果逐层向左/右,路径取决于树结构 |
| 17 | 二分查找比较次数 | 先固定闭区间/半开区间,再逐次记录 mid |
| 18 | SFTP 与 SCP 能力差异 | SFTP 支持更完整远程文件操作;SCP 主要是复制 |
| 19 | 复合候选键表示学生—课程唯一成绩 | (student_id, course_id) |
| 20 | 预训练增强图像语义的任务 | 对比学习等能拉近正样本、拉远负样本 |
| 21 | C++ 私有成员访问 | 类外直接访问 private 成员会编译错误 |
| 22 | 窗口排名并列处理 | 使用并列排名规则,明确是否跳号 |
| 23 | COUNT(*)、COUNT(score)、COUNT(DISTINCT score) | 分别统计行数、非 NULL 数、非 NULL 去重数 |
| 24 | 曲面法向量与平面法向量平行 | 梯度与平面法向量成比例,再代回曲面方程 |
| 25 | Bellman-Ford 与不可达负环 | 只从 dist[u] != ∞ 的可达边开始松弛 |
第 1~3 题未出现在录屏中,不能补猜;题号 15、16、23 的参考答案可用于复习,但不声称录屏中选择了对应选项。
明确错题
| 题号 | 录屏可见的最终选择 | 参考答案 | 错因 |
|---|---|---|---|
| 4 | A:扩大顺序读块和预取跨度 | D:限制预取窗口并保护当前工作集 | 顺序预取过大时会把仍有复用价值的热页挤出缓存;应缩小预取窗口、保护工作集,而不是继续放大预取。 |
| 5 | D:用 1×1 卷积解决维度不匹配 | C:ResNet-18 有 18 个卷积层 | “18”是网络总层数(通常含最后的全连接层),不是 18 个卷积层;1×1 投影捷径、下采样和残差连接的其余描述成立。原始 ResNet 论文给出了 18 层网络及残差重构思想,见 Deep Residual Learning for Image Recognition。 |
| 7 | A:base → sensor → cache → module → ... | B:构造 base → sensor → cache → module,析构反向进行 | 派生类构造先构造基类,再按成员声明顺序构造成员;析构严格反向。题目给出的关闭顺序应为 module → cache → sensor → base。 |
| 8 | C:SIP 服务器负责 NAT 穿透 | B:STUN/TURN | STUN 用于发现公网映射地址,直连失败时 TURN 中继媒体;SIP 信令服务器不是 NAT 穿透的核心机制。 |
| 9 | B:root 创建的目录不受 umask 影响 | C:普通文件默认最大权限为 0666 | umask 会从创建权限中屏蔽位;普通文件基础权限是 0666(不带执行位),目录基础权限是 0777。root 并不会天然绕过这一规则。 |
| 11 | A:p=0.6418 大于 0.05,说明有显著差异 | B:p>0.05,不能拒绝原假设 | 在常用显著性水平 0.05 下,p 值大于阈值只能说明证据不足,不能宣称统计显著。 |
| 17 | B:3 次比较 | A:4 次比较 | mid=(left+right)//2 且右边界取 n 时,目标 20 的比较序列为 19、31、27、23,随后区间为空,共 4 次。 |
| 18 | C:SFTP 基于 FTP,SCP 支持远程删除和建目录 | D:SCP 不提供远程删除/建目录,SFTP 提供 | SFTP 是基于 SSH 的文件传输协议,支持较完整的远程文件操作;SCP 主要是安全复制,远程目录管理能力有限。 |
| 24 | A:(-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。 |
参考答案与核对状态
| 题号 | 参考答案 | 录屏核对 |
|---|---|---|
| 6 | C | 选择正确 |
| 10 | A | 选择正确 |
| 12 | B | 选择正确 |
| 13 | A | 选择正确 |
| 14 | D | 选择正确 |
| 15 | B | 最终选项未稳定确认 |
| 16 | A | 最终选项未稳定确认 |
| 19 | A | 选择正确 |
| 20 | B | 选择正确 |
| 21 | B | 选择正确 |
| 22 | C | 选择正确 |
| 23 | D | 最终选项未稳定确认 |
| 25 | B | 选择正确 |
第 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。 - 录屏结束时没有点击“提交本题型”,没有官方判题结果,因此只能评价验证过程,不能评价最终得分。
应保留的实现检查表
- 先过编译门禁:每次修改后先执行完整构建,再运行样例和自测;编译失败时不要把之前的通过日志当作当前版本证据。
- 对齐 HTTP 合约:GET 查询参数必须放在 URL;要求幂等的 POST 必须在测试请求中显式携带
Idempotency-Key,并验证相同 key 重放返回同一业务结果而不重复写入。 - 状态转移原子性:所有权代次、凭证替换、风险冻结、审计事件应在同一事务边界内更新;失败、超时、重复请求都要保持不变量。
- 并发与隔离测试:对同一实体的并发转移、扫码和冻结做压力/竞态测试,检查是否出现双重成功、代次回退、分支状态互相污染。
- 测试契约可审计:样例脚本、路由实现和错误码定义必须来自同一份接口契约;若测试预期与服务端约束冲突,应先修正测试输入或明确题目要求,再判断实现是否正确。
关联专题
本次回答中需要改进的地方
客观题
- 缓存题:把“顺序访问”简单等同于“预取越大越好”,忽略了热工作集被污染的代价。
- 深度学习题:没有核对 ResNet 的层数统计口径,把总层数误读成卷积层数量。
- C++ 生命周期题:没有按“基类—成员声明顺序—派生类,再完全反向”逐项展开,导致构造/析构顺序选反。
- 网络与权限题:把 SIP 当成 NAT 穿透协议,并把 root 身份当成绕过
umask的条件;应先按协议职责和权限公式排除干扰项。 - 统计题:将“p>0.05”误读为“差异显著”,需要固定显著性检验的拒绝规则。
- 二分题:没有记录每次 mid 和新区间,比较次数少算一次。
- 文件传输题:混淆 SFTP 与 SCP 的远程操作能力,答题前应按 SSH 子系统/安全复制的定位区分。
- 向量法向量题:列出平行条件后未代回曲面方程复核 z 坐标,且 x 的符号判断错误。
AI Coding
- 没有在提交前完成“构建成功 → 样例全通过 → 幂等/并发关键用例通过”的闭环。
- 修改测试请求后仍未核对服务端必填请求头,导致把接口契约错误暴露为 HTTP 400;后续应把请求方法、URL 查询、请求头、错误码逐项对照 README/路由定义。
- 录屏结束前未提交题型,导致没有官方判分证据。时间不足时应先保住可编译主路径,再提交一个可审计版本,并记录未覆盖的边界。