春招笔试的热度每年都在涨今年携程的第一批算法工程师笔试刚结束就有不少朋友来问我考了啥、难度怎么样、该怎么准备。说实话这批笔试题给我的整体感受是覆盖面很广但并不是那种偏难怪题堆砌的卷子反而很看重基础功和业务思维的结合。这篇文章我按自己的复盘习惯来写把这次携程算法岗第一批笔试的完整情况拆开讲清楚考了什么、每类题型的底层逻辑是什么、我当时是怎么思考的、哪些地方容易翻车。如果你是准备后续批次或者其他大厂算法岗的同学这篇可以当作一份直接的参考清单来用尤其是那些“知道会考但没复习到位”的细节我会重点标出来。1. 笔试前的基本盘携程算法岗到底在考什么1.1 从业务反推考点OTA场景下的算法工程师画像在正式聊题目之前我觉得有必要先讲讲携程这家公司的业务逻辑。它和纯电商、纯内容平台不太一样核心业务是在线旅游涵盖机票、酒店、火车票、度假、商旅等大板块。这意味着算法工程师在日常工作中接触的数据和问题往往围绕这几个方向展开第一是搜索与推荐。用户打开App搜酒店、查机票背后是一整套召回、粗排、精排、重排的链路。这块对候选人的机器学习基础、排序模型理解、特征工程能力要求非常高笔试里对应的就是大量的机器学习理论选择题和搜索排序类业务题。第二是运筹优化。酒店的价格策略、机票的舱位控制、库存的实时分配这些本质上都是运筹学问题。今年特别明显运筹算法工程师的岗位热度很高笔试里也出现了线性规划、动态规划相关的题目甚至有一道场景题直接和经济收益管理相关。第三是内容与 NLP。用户评论的情感分析、智能客服的意图识别、攻略内容的自动生成这些都需要 NLP 功底。今年笔试的选择题里考查了词向量、注意力机制、文本分类评价指标等内容。第四是图像与 OCR。别以为携程只是做旅游的它每年要处理大量用户上传的证件照片、酒店实拍图、景点图片图像算法团队一直在做证件识别、图片质量打分、内容审核这些事情。所以笔试中出现了图像分类、目标检测基础、数据增强策略相关的考点非常合理。知道了这些业务方向你再看笔试题就会觉得“每道题都不是白出的”。比如它考你一个排序模型的 AUC 计算背后对应的就是酒店列表页的点击率预估考你一道动态规划可能就是在模拟多个订单在多个库存之间的最优分配。所以复盘笔试题不能只看题本身更要看到题目背后的业务模型。1.2 考试形式与整体流程回顾这次笔试是在牛客网平台上进行的需要双机位监控这个要提前准备好。整体时长是 120 分钟总分 100 分。题型分布大概是这样的单选题约 20 道每题 2 分共 40 分覆盖数学基础、机器学习理论、深度学习基础、数据结构常识。多选题约 5 道每题 3 分共 15 分错选不得分漏选得一部分分数这个规则要留意。编程题2 道每题 15 分共 30 分核心代码模式不用处理输入输出但要求函数实现正确、边界处理完整。主观业务题1 道共 15 分通常是给一个实际业务场景让你描述解决方案。说实话这个分数分布很说明问题笔试不只是考算法题机器学习理论占了很大的比重。很多同学准备大厂笔试时一门心思刷 LeetCode结果上了考场发现选择题疯狂丢分编程题又没写好最后总成绩没到面试线特别可惜。携程这种题型结构在大厂里算是比较典型的“理论 代码 业务”三合一套路。2. 题型全景拆解拿到试卷先别慌按这个优先级来2.1 选择题的考察范围与典型题目复盘这次选择题给我的感觉是广度优先深度适中但坑不少。数学基础部分考了概率论贝叶斯公式、期望方差、线性代数矩阵特征值、矩阵乘法维度、高等数学求导、极限难度约等于本科期末考试偏上的水平。举个例子有一道题给了三个事件 A、B、C问在 A 发生条件下 B 与 C 独立的判断是否正确。这道题表面考条件概率实际考的是条件独立和独立这两个概念的区别。这恰恰是很多同学容易混的点两个事件在全局下可能不独立但在某个条件下可能是条件独立的反过来也一样。我当时用的是定义法验证 P(B∩C|A) P(B|A) * P(C|A) 是否成立这种题没办法靠直觉蒙只能老老实实算。机器学习理论部分覆盖了偏差与方差、过拟合的解决办法、L1 与 L2 正则化的区别、逻辑回归的损失函数、决策树的划分依据、随机森林与 GBDT 的区别、AUC 的含义、交叉验证的方法等。其中有一道题问“L1 正则化为什么能产生稀疏解”选项里有一个描述是“因为 L1 正则项在零点不可导导致优化过程中参数更容易被压缩到零”这个是对的。但很多同学选成了“L1 正则项比 L2 大所以参数被压得更小”这个表述是不准确的。L1 的稀疏性本质上是约束区域的尖角效应这个要理解到几何层面才稳。深度学习部分考了反向传播的梯度计算、激活函数的特性、BatchNorm 的作用、注意力机制的 QKV、Transformer 的结构等。有一道题给了一个简单的两层网络让你手动计算某个参数的梯度这类题看着简单但非常容易算错关键是注意链式法则的路径和 sigmoid 的导数形式。2.2 多选题的“漏选得分”策略多选题是 5 道考的内容并不偏但选项设计得很绕。比如有一道题问“下列哪些操作可以缓解过拟合”选项包括增加训练数据、增大模型复杂度、加入 Dropout、降低正则化系数、Early Stopping。这里最容易纠结的是“增大模型复杂度”从这个角度看它确实会加剧过拟合所以不能选。这里我要特别提醒一个策略在牛客网这类平台上多选少选有部分分但错选直接零分。如果你对某个选项只有 60% 的把握我的建议是宁可不选它保全其他确定选项的分数。笔试时间本身紧张多选题没有必要追求满分拿稳每一道能拿的分最终总分反而更高。2.3 编程题携程喜欢考的数据结构类型编程题只有两道但含金量很高。第一道题是最长递增子序列的变种给了一个数组要求找出最长的连续递增子序列长度但加了一个限制条件可以进行一次相邻元素交换。这个条件直接让题目从“简单”变成了“中等偏上”。第二道题是图论相关给定一个无向图和一些必须经过的点要求找到从起点出发经过所有必须点再回到起点的最短路径。这个本质上是旅行商问题的一个简化版本数据范围不大可以用状态压缩动态规划解决。这两道题覆盖了动态规划和图论两个高频考点也是我后面要重点复盘的内容。第一题我一开始想用贪心误判了走了弯路第二题则是因为状态转移的边界条件没处理好差一点没写对。这些踩坑细节我会在下一章详细展开。3. 编程题核心解题思路复盘两道题的完整推导3.1 最长连续递增子序列允许一次相邻交换先说题面给定一个长度为 n 的整数数组你最多可以执行一次操作交换相邻的两个元素。要求操作也可以不操作后数组中最长连续递增子序列的长度。最暴力的做法当然是枚举所有相邻交换的位置然后对每个新数组求一次 LIS连续版复杂度是 O(n^2) 的扫描加上 O(n) 的交换总复杂度 O(n^2)。对于 n 1000 的测试数据这个解法是能通过的。但笔试的隐藏测试里很可能会出 n 到 10^5 的数据O(n^2) 就直接超时了所以要想更好的方法。我的思考过程是这样的交换相邻两个元素 a[i] 和 a[i1]只会影响跨越这两个位置的连续递增段不会影响其他位置。所以我们可以先预处理两个数组left[i]从 i 向左延伸的最长连续递增长度包括 i 本身right[i]从 i 向右延伸的最长连续递增长度包括 i 本身然后枚举交换位置 i 和 i1。交换后可能的递增段可以分为几种情况完全不跨越交换位置的段长度由原来的 left/right 决定。跨越交换位置的段需要考虑 a[i1] 和 a[i] 交换后的新排列。举个例子原数组是 [1, 3, 2, 4]。left[2] 1因为 3 2从 2 向左只能延伸到自身right[3] 14 是末尾向右只能延伸到自身。如果我们交换索引 1 和 2即 3 和 2数组变成 [1, 2, 3, 4]这时整个数组都是连续递增的长度是 4。计算时我们看交换位置 i 和 i1 后新的相邻关系是 a[i1] a[i]因为交换后 a[i1] 到了 i 的位置a[i] 到了 i1 的位置。那么从位置 i 向左可以延伸 left[i] 个元素注意这里 left[i] 计算的是以 a[i] 结尾向左的最长递增段但交换后位置 i 的新值是 a[i1]所以需要重新判断。这就是关键的转化逻辑交换后我们实际上要判断以 a[i1] 结尾向左的递增段和以 a[i] 开头向右的递增段中间衔接处是 a[i1] a[i]。最终答案的表达式大致是ans max(ans, leftLen rightLen)其中 leftLen 1 left[i-1]如果 a[i1] a[i-1]否则 leftLen 1rightLen 1 right[i2]如果 a[i] a[i2]否则 rightLen 1然后还需要考虑 left[i] 和 right[i1] 这些不跨越交换处的段取最大值。这里有个细节很容易漏如果交换后 a[i1] 仍然小于等于 a[i-1]那么左侧的递增段会被截断只能从位置 i 重新开始。我在考场上第一次写的时候只考虑了 a[i1] a[i-1] 的情况没处理截断的情况结果样例过了但隐藏用例挂得很惨。考后复盘才补上这个分支。这类题核心是把“交换”这个操作的影响局部化然后用预处理数组快速计算新状态的值。类似的题目在力扣上有不少比如“替换一次子数组后数组的最大值”“最多翻转一个 0 后连续 1 的最大个数”套路是一样的但加了递增序列的判断后就麻烦一些。3.2 必须经过指定点的最短回路状态压缩 DP这道题更典型。给定 n 个点n 15和 m 条边无向带权图要求从起点 0 出发经过所有标记的 k 个必须点各至少一次最后回到起点 0求最短路径长度。注意点可以重复经过所以最短路不一定是简单路径。看到 n 15 这个数据范围第一反应就是状态压缩。记 dp[mask][i] 表示当前已经访问过的必须点集合为 mask用 k 位二进制表示最后到达第 i 个必须点时的最短路径长度。初始状态是 dp[1 i][i] dist(0, p[i])即从起点出发直接去第一个必须点。状态转移时从当前必须点 i 去下一个必须点 jdp[mask | (1 j)][j] min(dp[mask | (1 j)][j], dp[mask][i] dist(p[i], p[j]))。最终答案就是 min_{i} dp[(1 k) - 1][i] dist(p[i], 0)。这里最重要的前置工作是先用 Floyd 跑一遍全源最短路得到任意两点之间的最短距离。因为点可以重复经过所以从 i 到 j 的距离必须是最短路的距离而不是直连边的距离。如果这里直接用原始边权去转移得到的结果一定不是真正的最短路回路这道题就直接没分了。我当时在考场上先用了堆优化的 Dijkstra 逐对跑最短路时间复杂度 O(k * (E log V))也能过因为 n 很小。但用 Floyd 写起来更简洁、更不容易出错三个循环直接完事。再说一个这题的易错点dp 数组初始化时要区分“不可达”和“到达自身距离为 0”两种情况。用一个大数 INF 初始化然后从 INF 转移时要判断 dp 值不等于 INF 再转移。另外k 个必须点的顺序是任意的所以状态压缩时需要用 mask 记录到达了哪些点而不是记录最后一步的“位置索引”这么简单。最后一步回到起点时也要用全源最短路的距离不能用直连边距离。状态压缩 DP 是大厂笔试的高频难点尤其是图论背景下。我自己的体会是这类题只要把“dp 状态定义”和“转移方向”想清楚代码量其实很小难点全在状态设计上。建议备考的同学把“状压 DP 最短路”这种组合题多练几道特别是 TSP 问题及其变形基本每个大厂笔试都会有一道类似题。3.3 关于核心代码模式与 ACM 模式的一点提醒这次编程题是核心代码模式也就是牛客会自动读取函数参数你只需要实现函数体并返回结果即可不需要管输入输出。对你来说这大大降低了格式错误的概率。但要注意核心代码模式下测试用例是分多个隐藏用例跑的所以你的函数必须对边界条件足够鲁棒。我做的时候第一题一开始没注意数组长度为 1 的情况导致 left[0] 直接数组越界。这种“数组长度最小为 1”的边界条件在 ACM 模式下可能靠手动测试能发现但在核心代码模式下多个测试用例共用同一个函数一个用例越界报错直接影响整道题得分。所以写完函数后一定要主动检查 n0、n1、全递增、全递减、相同元素等边界情况。4. 机器学习与深度学习考点梳理这些坑我替你踩过了4.1 理论基础损失函数、正则化、偏差方差选择题里面机器学习理论占了差不多一半的分量而且考得挺细。比如有一道题给了交叉熵损失函数和平方损失函数问哪个对异常值更敏感。答案是平方损失函数因为误差项被平方放大异常值的梯度也更大会导致模型为了拟合异常点而牺牲其他正常样本。还有一道题是关于逻辑回归的问当特征之间存在强共线性时逻辑回归的系数估计会发生什么变化。这里考了一个容易被忽略的点逻辑回归的损失函数本身没有正则约束共线性会导致系数方差变大、不稳定但对预测概率的影响可能不大。这是和岭回归、Lasso 不一样的地方。我当时选的是“系数估计的标准误变大模型解释性变差”事后查资料确认这个是对的。另外有一道偏差方差的题一个模型在训练集上准确率接近 100%但在验证集上准确率只有 72%问这种情况属于高偏差还是高方差。答案显然是高方差也就是过拟合。选项里混了一个“高偏差高方差同时存在”的干扰项这种情况在实际中也会出现但一般来说这种题目默认偏差方差是互斥的选“高方差”即可。备考建议是把李航的《统计学习方法》里面关于感知机、逻辑回归、SVM、决策树、集成学习的章节吃透。尤其是正则化、损失函数、优化方法这三块选择题的考点非常集中。不用背公式但要能判断公式所表达的性质。4.2 模型评估AUC、P/R、NDCG评估指标也考了好几道。比如有一道题问 AUC 的取值范围和含义选项中有“AUC 等于 0.5 代表模型随机猜测”“AUC 等于 1 代表模型完美分类”“AUC 表示正样本得分高于负样本得分的概率”这几个表述全部是对的。但有一个选项说“AUC 对类别不平衡不敏感”这个其实是对的但很多人不敢选。AUC 本身是排序指标不依赖于具体阈值所以即使正负样本比例严重失衡AUC 依然能反映模型的排序能力这就是它为什么在点击率预估这类场景中那么常用。另外还考了 P-R 曲线的特点当正负样本分布发生变化时P-R 曲线的形状会受到影响而 ROC 曲线相对稳定。这是面试里经常问到的点笔试也不例外。NDCG 是在搜索排序场景下的核心指标今年也考了给了三个文档的相关性标签和模型预测的排序让计算 DCG 和 IDCG 的比值。这类题其实就是套公式但要注意 NDCG 计算时到底按 log2(i1) 还是其他底数不同题目约定不一样看题干是否给出公式。今年给的公式是 DCG sum(rel_i / log2(i1))i 从 1 开始。我按照这个算了一遍小心了对数上下限最终没有踩坑。4.3 行业热点延伸大模型部署与图像算法的高频考点今年笔试里还穿插了一些和行业热点相关的题。比如有一道多选题问“为了让大语言模型在端侧或小算力设备上运行可以采用哪些方法”选项包括模型量化如 INT8/INT4、知识蒸馏、剪枝、低秩近似、增大上下文长度。正确答案是前四个增大上下文长度反而会增加显存占用和推理延迟与轻量化目标背道而驰。这其实对应了最近特别火的开源工具 llama.cpp。你应该也听说过它做的就是大模型的轻量化推理通过 GGUF 格式的量化、内存映射加载、批处理调度这些手段把原本要几百 GB 显存才能跑的模型压到普通消费级显卡甚至 CPU 上也能跑。笔试不一定会让你写相关代码但很可能会从工程思路的角度考你压缩模型有哪些手段、各自的优缺点是什么。图像算法这块也有涉及有一道题问“在图像分类任务中数据增强可以选用哪些操作”选项有随机裁剪、水平翻转、颜色抖动、mixup还有一个是“对标签做平滑”。答案应该是前四个标签平滑是另一个层面的正则化技术不属于数据增强。还有一道题考了目标检测的常见指标 mAP问 mAP 的计算依赖哪些值我选了 Precision 和 Recall这个也对了。我的建议是备考算法岗笔试时别只看机器学习理论也要稍微关注一下当前开源社区的技术动态。像 llama.cpp 这类工具你不需要深入源码但至少要知道它解决了什么问题、主要用了什么核心技术。毕竟企业招人越来越看工程落地能力试卷上出现这类题已经是趋势了。5. 业务场景题算法工程师不只是调包5.1 酒店搜索排序一个典型的业务问题主观题给你一个场景用户在携程 App 搜索某城市的酒店返回结果列表有几十个酒店如何设计一个排序算法让用户更容易找到满意的酒店这道题完全没有标准答案但考察的是你能否把算法技能和业务逻辑结合起来。我当时是分几个层面来回答的第一层是明确目标。排序的核心是提升用户的预订转化率所以目标函数不能只看点击率还需要考虑预订率、收藏率、用户长期满意度等指标。可以把目标定义成多目标的加权比如 Score w1 * pCVR w2 * pClick w3 * 价格离散步的惩罚项。第二层是特征体系。酒店搜索排序的特征可以分为三块用户特征历史预订偏好、价格带偏好、差旅/度假标签、酒店特征评分、星级、价格、距离市中心距离、设施、品牌、上下文特征搜索时间、入住日期是否为节假日、入住天数、搜索设备。这些特征要设计成可解释的、可监控的。第三层是模型选型。从工业界实际来看排序模型的主流路径是 LR - GBDT - Deep Model如 DIN、DCN、双塔。在笔试答案里我会强调两阶段排序粗排用轻量模型如双塔、精排用复杂模型如 DeepFM 或 DIN并且要在精排阶段加入用户行为序列建模。第四层是离线评估与在线验证。离线评估用 NDCG、GAUC 等指标在线验证用 AB 实验观察预订转化率、用户停留时长、次日回访率等指标。还需要设计模型的冷启动方案新酒店没有历史行为数据时可以用同类酒店的平均特征作为替代。5.2 运筹优化场景机票超售与舱位控制另一道主观题或者说是附加题是关于机票收益管理的如何用算法决定一个航班上哪些舱位开、哪些舱位关以最大化整班航班的收益这正是运筹算法工程师的核心工作。我大概写了这样的思路把每个舱位看作一个价格等级每个价格等级对应一个销售数量上限目标是在航班起飞前把所有座位以尽可能高的价格卖出去。这是一个典型的动态定价问题。具体来说可以用动态规划建模假设航班离开前还有 t 天剩余座位 n 个未来需求的概率分布已知那么每天可以决定是否接受当前价格的预订请求。价值函数 V(t, n) 满足贝尔曼方程最优策略是当且仅当当前价格 p 大于等于临界值 V(t, n) - V(t, n-1) 时接受预订。这个临界值就是“机会成本”也叫超售保护水平。这类问题的难点在于需求概率分布的估计以及价格、需求、时间之间的联合关系。笔试中不需要你把公式推导写完整但你要能把这个建模思路说清楚并体现出你理解“收益最大化不是卖得越多越好而是要在合适的时间把座位留给愿意出高价的用户”。5.3 怎么写好一道业务题框架比细节更重要我见过很多同学写业务题时上来就写“用 XGBoost”或者“用 LSTM”完全没有需求分析的过程。在阅卷人看来这种答案说明你根本没有理解业务问题只是把自己会的东西往上堆。我的建议是业务题的答案严格按“问题定义 - 数据与特征 - 模型选型 - 离线评估 - 在线策略 - 迭代优化”这个框架来写每一部分控制在三到四句话重点突出决策逻辑和取舍。不用追求面面俱到但要让阅卷人一眼看出你有系统性的工程思维。比如酒店排序那道题如果你能写出“我要在粗排阶段先过滤掉 90% 的酒店精排阶段再对剩下 10% 精细打分”哪怕模型名字写得不那么新这个思路本身就很加分因为它说明你理解真实系统里的性能约束。6. 备考时间规划与实战策略从现在开始该怎么准备6.1 考前一个月把零散知识织成网如果你正在为后续批次或者其他大厂笔试做准备我的建议是至少留一个月时间按三周知识梳理 一周模拟实战来安排。第一周的重点是数学基础加数据结构。概率论、线性代数、高数这些内容不需要做太多难题但要保证看见题目能快速反应出解法。数据结构方面把数组、链表、栈、队列、哈希表、二叉树、堆、图这八类结构的常见操作和复杂度背熟尤其是图和堆笔试编程题的最爱。第二周专注机器学习与深度学习理论。把 LR、SVM、决策树、GBDT、XGBoost、随机森林这几个经典模型的原理、损失函数、优缺点过一遍深度学习重点掌握反向传播、常见激活函数、CNN 基本组件、RNN/LSTM、Transformer/Attention。每个模型要能说出一个实际应用场景这样选择题和业务题都能用上。第三周进入刷题模式。重点刷动态规划、图论相关题目以及滑动窗口、双指针、前缀和这些笔试高频题型。每天至少保证三道编程题的完整编码和自查尤其是看自己能不能一遍通过。很多同学刷题时只是看看思路就跳过这是大忌笔试要求的是“手稳”不是“眼会”。第四周做真题和模拟。找牛客上往年大厂的真题卷严格按照 120 分钟的时间来模拟中间不要暂停。做完后重点分析自己哪类题目浪费的时间最多、正确率最低然后有针对性地补短板。6.2 考场上的时间分配技巧120 分钟做 20 道单选、5 道多选、2 道编程、1 道业务题时间其实是非常紧张的。我自己的分配策略是选择题控制在 35 分钟以内无论会不会单选先凭直觉选出一个答案如果有疑问的题目做个标记然后立刻做编程题两道题占 45 分钟因为编程题是最容易拉开差距的部分且一旦思路卡住耗再久也可能白搭最后用 30 分钟做业务题。这里有个关键技巧不要把时间卡死在选择题上。很多同学总想把每道选择题都做对结果前面耗了 50 分钟后面编程题只能草草写完这是最不划算的。选择题的分值单价远比不上一道完整通过的编程题你要学会“先拿稳的分”。另外遇到一道编程题看了 10 分钟还没有完整思路时先把这个题的暴力解法写出来。暴力解法通常能通过一部分测试用例拿到部分分然后你再用剩余时间去优化。笔试不像面试不追求“最优解才给分”很多时候“能跑的暴力解 清晰的优化思路”反而比写了一个复杂但没调试好的代码得分更高。6.3 线上笔试的环境和设备准备今年是双机位监控这意味着你需要一台主电脑做题一台手机或者副设备放在侧后方拍到你。笔试开始前一定要提前一天测试摄像头、麦克风、网络。我见过有人考试到一半因为网断了直接掉出系统这种情况虽然可以申诉但非常影响心态和答案完整性。另外一个小细节是牛客网笔试支持本地 IDE 吗不同公司设置不一样有些公司只允许网页端在线编辑器有些允许本地 IDE。如果允许本地 IDE建议你在本地把代码跑通再复制上去因为本地 IDE 的调试能力比网页编辑器强很多。如果不允许那就要提前适应网页编辑器没有代码补全、没有快捷键的“裸写”状态我建议平时刷题就尽量在牛客网的编辑器里直接写别总依赖本地 IDE。7. 常见问题与避坑指南这些丢分点必须记住7.1 选择题丢分的三大原因第一个坑是审题不清。选项里经常出现“一定”“必须”“唯一”这类绝对化表述绝大多数情况是错的。但也有一些例外比如“AUC 等于 1 时模型一定完美分类”这个是对的。你要结合具体语境来判断不能看到一个绝对词就机械地认为是错。第二个坑是概念混淆。比如把“偏差减少”等同于“模型变好”。实际上偏差减少通常意味着模型复杂度增加方差也会增加所以要综合考虑。还有“过拟合和欠拟合的判断”也是高频易错点。第三个坑是公式记不牢。像贝叶斯公式、条件熵、信息增益、基尼指数的计算公式考场上现推会消耗大量时间而且容易出错。建议考前把这些必备公式写在纸上反复默念特别是决策树的划分依据公式和概率论的贝叶斯公式这两类笔试题基本必出。7.2 编程题的边界条件自查清单编程题丢分最惨的往往不是思路不对而是边界条件没有处理。我给自己总结了一个清单每次写完代码后按这个清单检查一遍数组长度为 0 或 1 时算法是否会越界或死循环所有元素都相同或都递增/递减时结果是否合理目标值不存在时返回的默认值是否符合题意图论题目中起点或终点不在图中时怎么办状态压缩 DP 中mask 为 0 或 full_mask 时的初始化是否正确大数相加或乘法时是否使用了正确的数据类型会不会溢出这次第二道题我就是因为 mask 从 0 开始初始化时直接跳过了“从起点到第一个必须点”的距离导致 dp 初始值全为 INF最终答案也全是 INF。还好我在本地跑测试时发现了这个逻辑问题迅速改正。如果你平时刷题时没有养成这个自查习惯建议从今天开始写题后专门检查这些边界条件成本极低但收益极大。7.3 心态管理与考场应急预案最后聊一个看起来不算知识点的知识点心态。笔试过程中一定会遇到一两道卡手的选择题或者提交后部分用例不过的编程题这些情况非常正常。如果一道编程题提交了一次发现错了两个用例不要慌先冷静读一下wrong answer提示看看是不是边界问题而不是着急推翻整段代码重新写。我在这次笔试中有一道编程题第一次提交后只过了 60% 的用例提示是“运行错误”。我检查后发现是数组下标越界也就是前面提到的 n1 导致 left[1] 访问失败。修改这个边界条件后再提交就全过了。这种问题在编译器里很容易暴露但在线编辑器的报错信息可能不完整需要你自己通过代码审查来找。建议平时练习时多做一步每道题提交通过后再故意造几个边界用例看结果是否符合预期。比如测试数组 [1]、[2,1]、[1,2,3,4]、[4,3,2,1] 这几种情况把自己的代码测试到“再也不想改”为止。这个习惯能让你在考场上既减少突发状况又能保持好节奏。写在最后的几句实在话整套卷子复盘下来我对这次携程算法岗笔试的判断是它非常看重候选人的基础是否扎实、思维是否成体系以及能否把算法知识迁移到具体业务问题上。纯靠刷题背模板可以拿到一部分分数但想拿高分还是得靠平时对机器学习理论、数据结构算法和业务场景的综合理解。我个人的一点体会是笔试本质上是一种“压力下的输出能力”测试。你平时懂多少、会多少是一回事到了考场上能不能在有限时间内把答案稳定地写出来是另一回事。所以备考时一定要多模拟真实考试环境逼自己在 120 分钟内完整做完一套题再复盘哪个环节慢了、哪个环节卡住了。这种刻意练习比单纯刷十套卷子都管用。希望这篇复盘能给你一些真实的参考价值。如果你正准备下一批笔试记得把文中的易错点、时间分配策略和边界自查清单收藏起来考前一晚过一遍上考场会更安心。有具体问题也可以在评论区直接问我看到后会尽量回复。祝顺利上岸。