拓冰建站拓冰建站
首页 / 资讯中心 / 正文

携程算法岗笔试复盘:从题型分布到解题思路全解析

2025年春招季刚开始携程集团的算法工程师第一批笔试就来了。作为一个把OTA赛道几个头部公司都投过一遍的过来人我对携程这套笔试题的印象是它不像字节那样追求“短时间压榨极限”也不像阿里那样动不动上超大模型而是非常务实地在考“你能否理解旅游场景下的真实问题并用算法给出可落地的解法”。这篇文章就把这次笔试的完整复盘写出来从题型分布、核心知识点、到具体解题思路和踩坑记录尽量还原一套能直接参考的备战框架。先说结论携程算法岗的笔试覆盖范围和你投的具体方向强相关。我投的是推荐方向笔试里除了通用的数据结构和算法题还有不少机器学习和业务场景题。如果你是投运筹优化方向的题目风格又会完全不一样这个后面专门讲。整体看下来这套题不偏、不怪但很吃基本功尤其考验你对业务指标的理解深度。1. 先摸清携程算法岗的“脾气”笔试到底在考什么1.1 从业务盘子看算法岗方向携程不是一家单纯的互联网公司它是OTA在线旅游平台赛道的头部玩家业务覆盖机票、酒店、火车票、门票、度假、商旅、国际业务等。不同业务线背后需要的算法能力差别很大这直接决定了笔试题的考核方向。从集团算法岗位的常见划分来看大致有这么几类推荐算法负责首页信息流、酒店列表、机票列表的个性化排序核心是CTR/CVR预估、召回排序、多目标优化。搜索算法负责站内搜索的Query理解、相关性排序、语义召回对NLP能力要求高。广告算法负责广告定向、竞价排序、预算控制核心是出价策略和流量分配。运筹优化负责资源调度类问题比如机票超售管理、酒店库存分配、接送机车辆调度、定价策略核心是数学建模和求解器使用。NLP算法负责客服机器人、评论情感分析、智能问答、多语言翻译核心是预训练模型和文本处理。计算机视觉负责图片审核、内容理解这个在OTA里相对小众。笔试的题目构成会围绕你投递的方向有所侧重。比如推荐方向的笔试题里机器学习基础题占比明显更高运筹优化方向的题里建模题和优化算法的题目更多。但无论如何通用算法题也就是常说的“手撕代码”都是所有方向必考的这部分是刷人的重灾区。1.2 笔试形式与时间分配携程的笔试一般通过第三方平台进行常见的是牛客网或赛码网。我这次走的流程是收到邮件通知确认笔试时间一般是统一批次。提前15分钟进入在线笔试房间完成摄像头、麦克风、屏幕共享的权限检测。正式答题总时长一般是120分钟到150分钟。题目类型包含选择题、编程题有的批次还有简答题或场景设计题。这里有一个重要的经验在线笔试的时间非常紧张尤其是编程题部分不要在一道题上死磕超过30分钟。笔试考察的不仅是你会不会还有你在压力下的取舍能力和代码熟练度。我在这次笔试中遇到的时间分配大致是这样的题型数量建议用时说明单选题10-15道20-25分钟覆盖机器学习、数学基础、业务逻辑多选题5道左右10分钟很容易漏选要谨慎编程题3-4道80-100分钟难度递进最后一题往往是压轴题简答题/设计题1-2道20-30分钟考察业务理解推荐和运筹方向常见注意有的批次编程题只有2道但难度高有的批次是4道但前两道相对基础。以我这次的经验前两道编程题基本是“热身级别”第三道开始上强度第四道是明显的压轴题。合理策略是倒着看题先花2分钟把所有编程题扫一遍判断难度梯度再决定做题顺序。1.3 不同算法方向的考察侧重点我整理了身边同学和社招朋友的反馈携程不同算法方向的笔试侧重点差异很大推荐/搜索方向数据结构与算法题难度中等偏上机器学习基础题覆盖广LR、GBDT、FM、DSSM这些都要懂会有一道业务场景题比如“如何优化酒店列表页的点击率”。运筹优化方向算法题更偏向动态规划和贪心建模题占大头比如“给定若干订单和运力如何分配车辆使得成本最低”。这类题目经常给一个简化版的真实业务场景要求你用线性规划、整数规划或者启发式算法给出解法。NLP方向机器学习题里会加入文本处理的题目比如分词、TF-IDF、词向量、Attention机制相关的知识点。编程题中也容易出现字符串处理的题比如文本相似度计算。AI算法工程师的职位还有一个特点它对工程能力有要求。笔试中偶尔会出现“给出这个算法的复杂度分析”“说明如何优化内存占用”这类问题。所以不要只刷题也要关注代码的时间复杂度和空间复杂度。2. 编程题这些题型是携程笔试的常客2.1 动态规划与状态压缩携程的编程题中动态规划是出现频率最高的考点之一。原因很简单旅游业务里天然存在大量决策问题比如行程安排、资源分配、路径规划这些问题的底层数学模型很多都能抽象成DP。我在这次笔试中遇到的第一道经典DP题大意是给定一个数组代表每天酒店的价格你需要选择连续若干天入住要求总花费不能超过预算B求最多能住多少天。这个题看起来简单但它不是普通的“最大连续子数组和”问题因为你要同时考虑“天数最多”和“总花费不超过B”这两个约束。难点在于如果直接枚举连续区间时间复杂度是O(n^2)在数据量大的时候会超时。正确的思路是滑动窗口。维护一个窗口右指针不断右移同时保持窗口内总花费不超过B不满足时就移动左指针缩小窗口。每次更新最大窗口长度。这个思路本质上是“双指针贪心”只是它的正确性依赖于“价格都是正数”这一前提。如果遇到价格有正有负那就要换成前缀和辅助数据结构来解。比如维护一个前缀和数组然后用平衡树或者单调队列来快速查找满足条件的最左边界。这里分享一个通用的DP解题模板# 步骤1定义状态 # dp[i] 表示前i个元素满足某种条件下的最优值 # 步骤2推导状态转移方程 # dp[i] min/max(dp[i-1] cost, dp[j] benefit) # 步骤3初始化边界 # dp[0] 0 或 dp[0] 初始值 # 步骤4确定遍历顺序 # 一维DP一般从左到右二维DP要注意依赖方向 # 步骤5复杂度分析确认是否有优化空间关于状态压缩有些DP题目的状态维度很高比如“同时考虑天数、剩余预算、当前城市”就是三维状态。如果维度超过3大概率需要状态压缩或者改为贪心DP混合策略。笔试中出现过一道旅行商问题的变种——给定若干城市和城市间的交通费用从起点出发要求经过所有城市至少一次并返回起点求最小花费。这类题的标准解法是状态压缩DP用dp[mask][i]表示已经访问过的城市集合为mask且最后停留在城市i的最小花费复杂度是O(2^n * n^2)。提示如果你发现DP的状态很容易定义但状态数量太大导致内存不够优先考虑用滚动数组优化空间或者对状态维度做降维。笔试中我见过不少同学知道转移方程但写不出来就是因为忽略了空间复杂度。2.2 图的遍历与最短路径旅游业务里离不开图论比如航班转机、路线规划、景点连线这些都是典型的图上问题。携程笔试里图论题出现的频率也不低而且有一个特点它喜欢把图论的壳套在业务场景里。举个例子这次的第二道编程题是“机场到达服务调度”的简化版有若干车辆和若干接机任务每辆车同一时间只能服务一个任务给定任务的地点、时间窗和车辆位置计算满足所有任务所需的最少车辆数。这个题本质上是一个求最大二分图匹配的题可以用贪心优先队列来做。先把任务按开始时间排序逐个处理看当前空闲的车辆里有没有能在任务开始前到达出发地的如果有就把它分配出去否则新派一辆车。这里的关键是“在任务开始前到达”要计算车辆当前位置到出发地的距离折算成时间再和时间窗比较。更常见的题目是“航班中转的最短时间”。给定多个航班每个航班有起飞机场、到达机场、起飞时间和到达时间问你从机场A到机场B最早什么时候到达。解法是建图每个航班看作一条有向边边的权重是转机等待时间加上飞行时间然后用Dijkstra求最短路径。图论的难点经常不在算法本身而在建图。笔试的环境下很多人看到题就慌其实只要冷静下来把节点和边定义清楚后面就是套模板。图论场景建图方式常用算法航班转机机场为节点航班为边Dijkstra / SPFA车辆调度任务为节点兼容性为边二分图匹配 / 贪心景点路线规划景点为节点距离为边Floyd / 并查集门票捆绑销售商品为节点组合关系为边拓扑排序 / 状态压缩2.3 字符串处理与哈希技巧字符串处理几乎是所有大厂笔试的“老朋友”携程也不例外。它的字符串题不会考什么KMP、后缀数组这种进阶内容更多是考哈希、双指针、滑动窗口和字符串匹配的综合运用。这次笔试编程题第三道就是一道字符串题给定一个长字符串S和一个模式串P你可以在S中任意位置插入字符问最少插入多少个字符使得P变成S的子序列。这个题其实是个很经典的动态规划变种本质是求S和P的最长公共子序列LCS答案是len(S) len(P) - 2 * LCS(S, P)。因为你在S中插入字符只是让P的字符可以分散到更长的序列里而中间的间隙需要用插入来补足。如果题目改成“使得P变成S的子串”那就需要用KMP找匹配位置再计算需要插入的字符数复杂度从O(n*m)降到O(nm)。哈希技巧在这里也很重要。笔试中有一类题是“判断两个字符串在某种变换下是否相等”比如循环移位、重排、字符替换。这类题用朴素的strcmp会超时正确做法是用多项式哈希比如滚动哈希预处理每个前缀的哈希值然后O(1)查询任意子串的哈希值。# 字符串哈希模板 def build_hash(s): base 131 mod 10**9 7 n len(s) h [0] * (n 1) p [1] * (n 1) for i in range(n): p[i1] (p[i] * base) % mod h[i1] (h[i] * base ord(s[i])) % mod return h, p, mod def get_hash(h, p, mod, l, r): # 返回s[l:r]的哈希值左闭右开 return (h[r] - h[l] * p[r-l]) % mod值得注意的一点是哈希碰撞在笔试里并不常见但万一遇到极端测试用例可能被卡所以有些有经验的选手会直接用双哈希两个不同模数或者用Python的字符串切片加集合去重在允许的复杂度下规避风险。3. 机器学习与深度学习基础选择题里的陷阱3.1 过拟合与正则化的底层逻辑携程笔试的机器学习选择题不像竞赛题那样考偏门公式它考的都是很基础但很容易混淆的概念。比如“L1正则化和L2正则化的区别”这个题几乎每次笔试题里都有。L1正则化Lasso的特点是会产生稀疏解也就是把一部分特征的权重压到0相当于在做特征选择。L2正则化Ridge的特点是让权重整体变小但不至于变成0它能控制模型的复杂度但不会产生稀疏解。这个区别的数学本质是L1的约束区域是菱形顶点在坐标轴上所以最优解更容易落在坐标轴上L2的约束区域是圆形最优解一般不会正好落在坐标轴上。笔试时经常会出一个变种给出一个损失函数的表达式问加入L1或L2之后权重更新公式变成什么。这里要特别小心L1的梯度在0点不可导所以实际实现中会用次梯度或者近端梯度下降Proximal Gradient Descent。还有一类高频题是“如何解决过拟合”。选项通常包括加大训练数据量、增加正则项、Dropout、Early Stopping、数据增强、降低模型复杂度。这个题的坑在于有些同学会选“增加模型参数数量”或者“增加训练轮数”这明显是错的——这恰恰是加剧过拟合的操作。提示遇到多选题时把每个选项都默认为判断题先独立判断对错再组合。不要因为“这个选项看起来像对的就不选了”。3.2 评价指标的选择推荐算法方向的笔试题评价指标是必考的。携程的业务场景里最核心的评价指标无非是CTR、CVR、转化率、GMV。选择题里会混合着考比如什么是AUC它代表什么含义什么是LogLoss它和AUC的区别是什么在数据极度不平衡的场景下用Accuracy合理吗GAUC和AUC的区别是什么AUC的全称是Area Under the ROC Curve它衡量的是“随机取一个正样本和一个负样本正样本得分高于负样本得分的概率”。它的好处是对阈值不敏感适合评估排序质量。但在实际业务中AUC高不一定代表业务效果好因为业务更关心头部排序的准确性这时候GAUCGroup AUC更常用——它先对每个用户分别计算AUC再按曝光量或点击量加权平均能消除样本在不同用户间分布不均的影响。LogLoss是一个严格评分规则proper scoring rule它同时考虑了概率的校准程度而AUC只看排序。如果笔试题问“评估点击率预测的概率校准情况应该用什么指标”答案首选LogLoss或者进一步用可靠性曲线Reliability Curve来判断。另一个高频考点是F1-Score。它是在Precision和Recall之间取调和平均。很多同学会混淆F1和简单平均公式是F1 2 * Precision * Recall / (Precision Recall)笔试出题时有时会给一个分类混淆矩阵让你自己算Precision和Recall。这里要注意在多分类中Micro-F1和Macro-F1有不同的计算方式Micro-F1把所有的样本汇总成一个混淆矩阵再算Macro-F1先对每个类别算F1再对所有类别取平均。如果题目没指定默认是算Macro-F1但会给提示。3.3 优化器与学习率深度学习部分的选择题通常围绕优化器和学习率出题。常见的问题SGD、Momentum、RMSProp、Adam分别在解决什么问题学习率过大或过小分别会带来什么后果什么是学习率预热Warmup它为什么有效什么是余弦退火Cosine AnnealingSGD的问题是收敛慢且容易在峡谷区域震荡Momentum通过引入历史梯度的指数加权平均来加速收敛RMSProp通过自适应调整每个参数的学习率来解决梯度尺度不一致的问题Adam则结合了Momentum和RMSProp的思想同时考虑一阶矩和二阶矩估计。这里有一个容易踩坑的点Adam虽然收敛快但有时候会泛化性能比SGD差因为Adam在后期可能因为二阶矩估计导致学习率过小错过最优解。所以很多大模型训练中会使用“先Warmup再Decay”的策略或者直接使用带权重衰减的AdamW。笔试中如果出“学习率初始值设置为0.1训练10轮后loss不降反升可能的原因是什么”这类题答案首先是学习率过大导致loss震荡甚至发散。这种情况下常规做法是把学习率降到0.01或者0.001并配合学习率衰减策略。其实我觉得这一部分的准备不需要去啃完整的深度学习理论只要把面试高频的几十个知识点吃透比如激活函数、归一化、正则化、优化器、损失函数、注意力机制基本就能覆盖笔试选择题的绝大部分。携程的笔试不会为了难而难它更看重你是否能清晰掌握“是什么、为什么、怎么用”这三个层次。4. 运筹优化题别把携程当成纯互联网公司4.1 资源分配类题型的建模思路如果你投的是运筹算法工程师方向笔试中会出现一类比较特殊的题目——业务建模题。这类题不会让你去写具体代码而是给一个场景让你设计数学模型或者算法方案。携程作为OTA这类题的业务背景非常真实比如酒店超售、机票定价、车辆调度、景区客流控制。我整理了一下经常出现的几种场景先看酒店超售这个经典问题。酒店为了保证入住率通常会接受一定比例的超卖。问题是超售多少才能让预期收益最大化我们可以建立一个简单的决策模型。设房间数为R超售数量为s房价为p因超售导致客人无法入住时的赔偿成本为c包括退款、赔偿和客户流失的隐性成本超过可入住数量的概率可以通过历史数据估计。目标函数是最大化期望收益E(s) p * min(R s, 实际需求) - c * max(0, 实际入住人数 - R)在实际笔试中题目会简化成已知历史入住人数服从某个分布求使得期望收益最大的超售量s。这类题考察的核心不是你会不会用复杂的随机规划而是你能否把一个业务问题转化成“决策变量约束条件目标函数”的形式。再比如机票定价问题。给定不同舱位的座位数和价格弹性需求求最优的舱位控制策略。这个问题可以用网络收益管理Network Revenue Management的理论来解决核心是用动态规划求每个航班组合的期望边际收益Expected Marginal Seat RevenueEMSR然后根据边际收益决定是否接受当前报价。笔试中一般只会让你写出EMSR的基本公式不会要你现场手推。4.2 实用的启发式求解技巧建模题之外运筹方向也有编程题。与推荐方向不同运筹方向的编程题很少考复杂的图论更多是考“在约束条件下做优化”的能力。这类题往往数值规模不大数据量从几百到几千但约束条件错综复杂而且精确解很难求。这种情况最实用的策略是先用贪心算法或者构造法求一个可行解Feasible Solution然后用局部搜索Local Search来改进。在笔试环境下只要你能给出一个比基准解更好的结果就有很大概率通过。我给大家分享一个我在实战中总结的模板流程用简单的贪心规则生成初始解比如“按优先级排序后依此分配”“最早截止时间优先”等。定义邻域操作常见的三种单点交换把一个任务从当前资源分配到另一个资源。区间反转把一段序列反转适合TSP类的路径规划问题。插入/移除把一个任务从序列中移除再插入到其他位置。设定一个时间上限比如5分钟在时间内反复执行“随机扰动局部搜索”。记录每次搜索得到的更优解最后输出全局最优。这种启发式方法在经典的“车辆路径问题VRP”“装箱问题”“排班问题”上都很有效。笔试里如果你能写出来至少能拿到一半以上的分数因为在线的评测系统不要求你求出最优解。注意这类题的代码量一般比较大建议提前准备好一些模板代码比如优先队列、并查集、二分查找、回溯剪枝等常用结构笔试时直接套用能节省大量时间。4.3 运筹优化题的实际案例拆解我模拟一道携程风格的运筹笔试压轴题给大家做个完整拆解题目背景某景区在节假日有N个旅行团到达每个团有不同的人数和一个期望入园时间区间。景区有小车和大车两种摆渡车小车核载6人大车核载20人。每辆车从景区门口出发到景点入口需要10分钟返回需要10分钟。要求所有游客在规定时间内比如从开园到闭园全部送达问最少需要多少辆摆渡车以及如何安排发车计划。这道题是一个变体的“调度问题”。难点在于每个旅行团的人数可能超过单辆车核载所以需要拆分成多个车次。每个车次必须满足“车容量约束”和“期望入园时间约束”。车辆可以循环使用一辆车送完一批客人后还能返回再送下一批。建模思路把每个旅行团按人数拆分成“乘车批次”。比如一个45人的团可以拆成2辆大车1辆小车但这样的拆分方式有很多种需要选择最优组合。定义决策变量每辆车在每个时刻执行哪个乘车批次。目标函数最小化总车辆数或者最小化总发车次数兼顾游客等待时间。约束时间窗约束、容量约束、车辆数量约束。笔试中如果遇到这种题最稳妥的做法是先写一个贪心版本把旅行团按期望入园时间排序从早到晚依次安排发车每辆车送完一趟后记录其返回时间当下一批客人需要用车时优先调用最早空闲的车辆没有空闲车辆就新增一辆车。这样的策略能得到一个“合理但不一定最优”的解先保住基本分。如果时间充裕再接一个局部搜索优化车辆数。这类题的价值在于它考察的不只是算法能力而是你的业务抽象能力。有没有把“人员运输”抽象成“资源调度”的能力决定了这道题能否拿到高分。5. 实战中的坑与复盘如何把笔试转化为面试筹码5.1 时间管理是最大的失分点参加完这场笔试我最深刻的感受是时间管理失误带来的失分远比“不会做”带来的失分要多得多。很多同学在选择题上纠结太久遇到一道不确定的机器学习概念题反复改来改去结果浪费了15分钟后面编程题根本没时间写完。这里我想说一个很现实的道理在线笔试只看最终提交结果不会因为你在某道题上深思熟虑就多给分。我的建议是选择题单题平均不要超过1.5分钟超过就先用直觉选一个并标记下来等所有题目做完之后再回来看。编程题要先花2-3分钟审题然后快速判断难度。如果一道题预计10分钟都写不完主逻辑果断先跳过去做下一道。还有一个容易被忽视的坑编译器版本和本地环境的差异。我身边有同学在本地用Python3.10跑得好好的结果在线评测的Python环境是3.8有些语法比如Python 3.9才支持的dict | dict合并、list[str]类型注解直接报错。笔试前一定要看清楚平台支持的编程语言和版本。平时刷题时你最好就在牛客或赛码的在线环境里练别总是本地IDE跑通了再粘过去。5.2 从笔试题目反向推断岗位关注点笔试不只是“被考察”它也是你了解目标团队技术栈的机会。你在准备面试时可以把笔试题目好好揣摩一遍会发现很多线索。比如这次笔试选择题中出现了大量关于“用户行为序列建模”的题目比如“如何把用户的点击序列编码用于点击率预估”“Self-Attention与DIN模型的区别是什么”这就说明携程推荐算法团队很关注用户行为序列建模。你可以推测面试环节很可能也会围绕这些方向提问。提前准备一个“用户序列建模在酒店推荐里的落地案例”在面试中会非常加分。还有一点从笔试题目里你还会发现团队的工程倾向。如果笔试中出现“关于特征工程的描述以下哪个是正确的”“处理稀疏特征时embedding维度如何选择”这类题目说明团队对特征工程有较高要求面试时可以提前准备相关的项目细节向量化、哈希技巧、特征交叉这些内容都要能讲清楚。提个醒笔试结束后如果平台提供题目回顾功能一定要把每道题你的答案和思路记录下来。这不光是为了复盘更是面试时的素材。面试官很可能会问“你笔试时那道XX题是怎么想的”这时候你能清晰地复盘会显得专业很多。5.3 笔试后的衔接准备与心态管理笔试只是整个招聘流程中的一环至少我觉得不需要因为笔试理想或不理想就过度兴奋或失落。从携程的流程来看笔试结束后一般1-2周会有结果通过的进入面试环节。这段时间非常宝贵不能干等。你可以做三件事第一把笔试中暴露出来的薄弱点列一个清单。比如你在机器学习选择题里错了一道关于梯度消失的题那就把这个知识点彻底弄懂包括为什么会梯度消失、有哪些解决办法、和梯度爆炸的区别是什么。第二准备一个“业务指标分析”的模板。携程面试中经常会出现开放性问题比如“如果酒店列表页的CTR下降了5%你会怎么排查”。这类问题没有标准答案但如果你能按照“确认数据口径-拆解影响因素-设计实验验证-提出优化方案”的框架来回答会比临时组织语言有条理得多。第三保持刷题节奏但不必高强度。笔试结束后每天保持在牛客刷2-3道中等难度的算法题即可目的是维持手感。同时重点看一些业务相关的机器学习案例比如推荐系统召回排序的经典架构、多目标优化的实际应用这些内容面试出镜率很高。心态方面想提醒大家一句线上笔试的偶然性很大一次失利不代表能力不行。我见过笔试挂掉的同学最后拿到了更心仪的offer也见过笔试高分通过却在面试时翻车的。别把笔试成绩当成人生的判决书它只是整个评估体系里的一环。真正重要的是你能不能从每次实战里提取足够的信息让自己在下一次机会来临时表现得更从容。最后分享一个我自己的小习惯每次笔试结束后不管结果如何我都会花30分钟立刻复盘。写清楚哪些题卡住了、为什么卡住、正确解法是什么存入一个专门的笔记目录。时间久了这个笔记就成了我面试前最核心的复习资料。每一场笔试的经验都不会白费它们都会转化为下一轮机会里的实战优势。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门