2025年春季的招聘季刚拉开帷幕携程集团的第一批算法工程师笔试就成了不少同学的第一站。作为一个在算法岗摸爬滚打了几年的人我第一时间也报名参加了这场笔试。说句实在话这种一线大厂的在线笔试考的不只是你会不会写代码更考验你在有限时间内的知识调用能力和代码细节功底。这篇文章就把我对2025年携程算法工程师第一批笔试的复盘和思考完整写出来从考察范围、题目拆解到备考方向尽量讲透希望能给正在准备春招的人一些实际参考。先交代一下这场笔试的基本盘。整个笔试时长120分钟题目类型以编程题为主带少量数据结构与算法相关的客观题。整体难度比我想象中要“克制”没有出现那种故意刁钻的偏题怪题但恰恰是这种看似常规的题目反而最容易在细节上拉开差距。比如KMP算法的next数组构造、排序算法的稳定性选择、贪心策略的反例构造这些都属于“你觉得自己会但一写就出问题”的知识点。很明显携程的出题团队更希望筛选出基础扎实、能快速上手业务代码的候选人而不是招一堆只会背题的人进来。1. 笔试考察范围与出题逻辑为什么所有考点都如此“基础”先说一个很多人容易忽略的点大厂算法笔试的题目往往不是越难越好而是越能反映“工程能力”越好。携程这次笔试给我的整体感觉是所有题目都来自经典算法与数据结构但每一道题都在考察你能否在真实场景中灵活运用而不是纯粹的记忆复现。从考察范围来看这次笔试主要覆盖了这几大类字符串处理与模式匹配涉及KMP算法及其next数组计算、字符串哈希、回文串判断等。排序与查找堆排序、快速排序、归并排序的实现与复杂度比较以及基于有序数组的二分查找变形。数据结构设计与应用栈与队列的灵活使用、哈希表的冲突处理、二叉树的遍历与层次结构。动态规划与贪心策略背包类DP、区间DP、以及贪心算法的正确性证明。数学与位运算快速幂、质因数分解、前缀和与差分思想。值得注意的是热搜词里反复出现的“粒子群算法原理”“KL散度与ELBO”“PID算法”这类偏向机器学习或控制理论的术语在这次笔试中并没有作为直接出题点。这其实很符合业界现状——大部分算法工程师岗位在笔试阶段考察的是计算机科学最核心的算法基础而非某个特定领域的前沿模型。你需要先把“数据结构与算法”这块基石打牢才有资格去谈业务中的模型优化。出题逻辑上我注意到携程很偏好“一个题目考多个知识点”的复合型设计。例如有一道题表面上是“字符串匹配”但如果你用KMP你需要同时处理next数组的计算和匹配过程中的边界如果你用哈希你还要考虑哈希冲突和溢出问题。这意味着单纯记住某个算法的模板远远不够你必须理解算法背后的原理才能应对各种变形。2. 第一类高频题从KMP到字符串哈希字符串题到底在考什么字符串处理几乎占据了这次笔试编程题的三分之一份额也是很多同学觉得“算法都懂但代码写不顺”的重灾区。我们先从最经典的KMP算法说起。2.1 KMP算法的next数组一个看似简单但总写错的细节题目背景通常是这样的给定一个文本串T和一个模式串P求P在T中出现的所有起始位置。最基础的做法是双重循环暴力匹配时间复杂度O(n*m)在字符串长度超过10^5量级时基本跑不完。这时候就需要KMP算法它的核心价值在于当某个字符匹配失败时不用回退文本串的指针而是利用已经匹配的部分信息将模式串尽可能向右滑动从而把时间复杂度降到O(nm)。很多人背KMP模板背得很熟但一遇到next数组的具体定义就懵了。这里我特别提醒一下next[i]在不同教材里定义有差异这次笔试明确写了“next[i]定义为模式串P[0..i]的最长相同前后缀长度”也就是说next[i]表示的是P的前缀子串中既是前缀又是后缀的最长长度且这个长度小于等于i。以热搜词中提到的pabacaba为例我们来手算一遍i0子串是a没有真前后缀next[0]0有些模板定义-1一定要看题目要求i1子串是ab前缀{a}后缀{b}无交集next[1]0i2子串是aba前缀{a, ab}后缀{a, ba}公共部分是a长度1next[2]1i3子串是abac前缀{a, ab, aba}后缀{c, ac, bac}无公共部分next[3]0i4子串是abaca前缀{a, ab, aba, abac}后缀{a, ca, aca, baca}公共a长度1next[4]1i5子串是abacab前缀{a, ab, aba, abac, abaca}后缀{b, ab, cab, acab, bacab}公共ab长度2next[5]2i6子串是abacaba前缀{a, ab, aba, abac, abaca, abacab}后缀{a, ba, aba, caba, acaba, bacaba}公共部分是aba长度3next[6]3这个计算过程就是KMP算法的核心。很多人在笔试中不是不会KMP而是把next数组的下标弄混或者忘记处理“最长相同前后缀长度可以等于子串长度减一”的情况。我的建议是考试前最好自己把next数组的推导过程完整走一遍不要只背代码因为面试官随时会在面试环节让你现场讲一遍这个过程。2.2 字符串哈希一种更“工程化”的替代方案除了KMP这次笔试中也出现了可以用字符串哈希解决的题目。字符串哈希的思想很简单把一个字符串看作一个进制数通过哈希函数映射到一个整数然后通过比较哈希值来判断两个字符串是否相等。常用的做法是使用131或13331作为进制取模一个大质数比如1e97。但这里有一个非常容易踩的坑哈希冲突。即使进制和模数选得好冲突概率依然存在笔试环境不允许你用概率性算法去赌AC。所以我一般建议如果题目允许就用双哈希或者直接用KMP这类确定性算法。在笔试中我选择了KMP因为字符串哈希虽然写起来短但在大数据量下如果碰撞一次就只能白白丢分。2.3 回文串处理从中心扩散到马拉车算法还有一道回文相关的问题题目要求找到字符串中的最长回文子串。O(n^2)的中心扩散法是最容易想到的笔试时如果时间紧完全可以先写这个拿部分分。但如果数据范围是10^6级别就必须上Manacher马拉车算法了。马拉车算法的核心思想是利用回文串的对称性避免重复计算时间复杂度O(n)。不过说实话马拉车算法在真实开发中用得极少笔试考它主要是考察候选人的知识广度。如果时间有限建议优先掌握中心扩散法和动态规划解法把马拉车当作扩展知识。3. 排序与查找的变形题为什么“会排序”不等于“会用排序”排序和查找是算法笔试的“送分题”也是“送命题”。这次携程笔试中的排序相关题目难度不在于实现排序本身而在于你能不能根据题目场景选择正确的排序算法。3.1 稳定性一个容易被忽略的选择标准有一道题给了一批包含多个字段的记录要求先按主字段排序再按次字段排序且保持相同主字段记录之间的原始相对顺序。这道题如果用的排序算法不稳定比如直接选择排序或者常规快排不处理稳定性就会直接出错。很多人在笔试时倾向于用快排因为平均时间复杂度O(nlogn)最理想。但快排是典型的不稳定排序如果题目强调了“保持原始相对顺序”就必须选择归并排序或者对记录加上索引字段用“双关键字排序”的思路解决。数据量大时归并排序的额外空间O(n)不是问题完全可以用空间换稳定性。3.2 堆排序与优先队列的活用另一道题是TopK问题从10万个数中找到最大的K个数。很多人第一反应是直接排序取前K个这在数据量小的时候没问题但当K远小于n时用堆排序是更优的选择。具体做法是维护一个大小为K的最小堆遍历数组时如果当前元素大于堆顶就弹出堆顶、插入当前元素遍历结束后堆里的K个元素就是最大的K个数。时间复杂度O(nlogK)空间复杂度O(K)。这道题真正想考察的是你对“数据规模”的敏感性。在携程这类旅游电商的业务中你经常要面对海量用户的访问日志、订单数据如果不能估算数据规模并选择合适的数据结构代码在生产环境跑起来可能会因为内存超限直接OOM。笔试中这题的隐藏分就在于你是否能写出O(nlogK)的解法而不是简单粗暴地全排序。3.3 二分查找的边界条件一个while循环里的世界二分查找在这次笔试中出现了不止一次从标准的查找目标值到寻找左边界/右边界再到旋转数组中的查找。我见过太多人在二分查找的while(left right)和while(left right)之间纠结最后要么死循环要么漏掉边界元素。这里分享一个我自己总结的规范写法统一使用左闭右闭区间循环条件是left right更新left mid 1更新right mid - 1。如果需要返回左边界就在nums[mid] target时让right mid - 1如果需要返回右边界就在nums[mid] target时让left mid 1。把所有情况都统一成这一种写法能有效减少思维负担避免笔试现场一边写一边怀疑人生。4. 动态规划与贪心策略推导过程比最终代码更值钱动态规划DP和贪心算法是算法工程师笔试的压轴戏也是拉开分数差距的关键。这次携程笔试的压轴题目我印象最深的一道是“带约束的最优路径问题”本质上是一个区间DP但如果你不能看清状态转移的方向很容易写错。4.1 状态定义是DP的第一步也是最重要的一步这道题的大概场景是给定一个二维网格每个格子有不同分值从左上角出发每次只能向右或向下移动要求路径上经过的格子总分最大。这是个标准的二维DP问题状态转移方程也非常简单假设dp[i][j]表示从起点走到(i,j)的最大分值那么dp[i][j] max(dp[i-1][j], dp[i][j-1]) grid[i][j]边界条件是dp[0][0]grid[0][0]第一行只能从左往右累加第一列只能从上往下累加。但题目在此基础上加了一个“不能经过某些障碍格”的限制这就把问题从送分题拉到了中等难度。很多人会把障碍格的分值设成一个很大的负数来处理这样虽然能避免走到障碍格但在某些情况下会让DP路径绕远导致结果错误。更严谨的解法是给不可达状态设置一个特殊标记比如-1转移时跳过这些状态。4.2 贪心算法的正确性证明凭直觉做题容易翻车有一道题是“区间调度”的变形给定若干个会议的开始时间和结束时间每个会议需要占用一个会议室问最少需要多少个会议室才能容纳所有会议。这题的思路其实不难把开始时间排序用一个小根堆维护当前正在进行的会议结束时间遇到新会议开始时就检查堆顶是否已经结束如果结束就弹出最后堆的大小就是所需会议室的最少数量。但如果你是凭直觉觉得“按结束时间排序然后贪心选”就能解就容易掉进陷阱。区间调度变体中有些情况下按开始时间排序才是最优的这取决于题目问的是“最多能参加几个会议”还是“最少需要几个会议室”。所以我在复盘时特别提醒自己贪心算法的每一步选择都必须有严格证明哪怕笔试现场不需要提交证明过程你也得在心里推演至少一遍反例。如果构造不出反例再动手写代码否则看起来对的解法可能在某个隐蔽的测试用例上挂掉。4.3 背包类DP的变体从0-1背包到完全背包另外一道需要留意的题目是背包类DP的变体。题目描述类似“有若干种优惠券每种优惠券有固定面额你的订单金额是amount问恰好凑满amount最少需要多少张优惠券。”这其实就是完全背包求最小数量的变形状态转移方程为dp[j] min(dp[j], dp[j - coin[i]] 1)但有个细节点容易出错如果某种优惠券永远无法凑出某个金额dp[j]会保持初始化时设的无穷大最终输出时要判断INF情况。很多人在这里忘记特判结果输出-1还是0搞混白白丢失一个用例。5. 从笔试实战到技术成长如何把一次笔试变成能力提升的杠杆笔试结束并不是终点而是能力进阶的起点。我每次参加完大厂笔试都习惯做三件事复盘题目分布、整理错误原因、规划补漏方向。这里把通用的方法也拆开讲一下方便大家直接复用。5.1 建立你的“错题本”与算法模板库我不建议单纯把笔试题目背下来而是建议大家维护一个属于自己的算法模板库。这个模板库可以按算法分类字符串、排序、二分、DP、贪心、图论、数学等。每个模板不仅要有一份可运行的代码还要标上“适用条件”“时间复杂度”“空间复杂度”“容易踩的坑”。比如KMP模板必须附上next数组的两种定义方式从0开始还是从-1开始二分模板必须注明使用的区间定义和更新规则。笔试时时间紧张如果你能快速定位到正确的模板并套用效率会高很多。但前提是你平时真的在模板里写清楚了每个细节。5.2 控制做题节奏先拿稳基础分携程这次笔试的编程题评分规则是“部分用例通过也有分数”也就是说你不需要每个测试点都AC才能过。这一点特别重要。我的策略是先从头到尾把所有题都扫一眼优先做最容易拿全分的题再做中等难度的题最后剩多少时间就冲一冲压轴题的一个子集。具体实操中我一般给每道题设定一个时间上限比如简单题10分钟、中等题20分钟、难题30分钟。如果超过上限还没头绪就先放下写一个暴力解或部分正确解法保证拿到一部分分数。这个策略帮助我在不少笔试里稳住了基本面尤其适合像携程这种题量不小的场次。5.3 笔试之外的长期积累代码能力才是根本说到底算法笔试是代码能力的一个侧面。你的代码风格是否干净、边界处理是否严谨、复杂度估算是否准确都会在笔试结果中体现出来。这个能力没法靠考前突击一晚上就提升最靠谱的方式还是每天刷一点题保持手感。我个人的习惯是每天至少写2道中等难度的算法题周末再加1道难题坚持一年下来笔试时的稳定发挥是水到渠成的事。这次携程笔试还有一点值得肯定在线评测系统的反馈速度很快提交后能立刻看到每个测试用例的结果。这种机制对排查边界条件是友好的。利用好每一次提交反馈能帮助你在现场快速修正思路而不是到最后才发现整个方向都错了。6. 给后续批次同学的备考优先级建议春招笔试往往不是只有一批携程后续应该还有第二、第三批。如果你还没参加或者参加了但不太理想建议根据自己的弱项重新安排复习优先级。我按“性价比”从高到低列一个备考清单第一优先级高频基础算法。KMP、二分查找、排序与TopK、二叉树遍历、基础DP这些都是高频考点必须做到闭着眼能写出来且要能讲清楚复杂度。第二优先级数据结构应用。栈、队列、哈希表、堆、并查集这些在实际题目中经常作为辅助结构出现要熟悉它们的适用场景和API复杂度。第三优先级进阶算法与数学。马拉车、线段树、树状数组、快速幂、状态压缩DP等属于“会了能加分不会不致命”的类型建议在基础稳固后再去扩展。第四优先级机器学习与业务场景算法。虽然笔试直接考的概率低但面试环节很可能会问某个业务场景怎么用机器学习解决所以也应该适度准备一些基础模型原理比如LR、GBDT、深度学习的常见结构。另外推荐大家多看看往年各大厂算法笔试的真题特别是携程、美团这些以业务场景著称的公司它们出题往往比较贴近实际业务逻辑比如订单分配、路径规划、推荐排序等等。提前熟悉这种“业务包装后的算法题”能减少笔试时读题和理解场景的时间。7. 写在最后一场笔试只是开始算法能力要持续打磨这次携程2025年春招算法工程师第一批笔试考完后我的一个最大感受是题目本身并不算难到离谱但考察得非常全面覆盖了从基础数据结构到复杂算法设计的多个层次。更重要的是它提醒了我——真正的算法能力不是背题的产物而是在一次次实战中不断修正、打磨出来的。如果你还在准备春招不必因为某场笔试的失利而焦虑。笔试系统会根据你的实际代码表现和用例通过率给分即便有些题没完全写出来只要你能展示出清晰的思路和完备的边界处理能力仍然有机会进入下一轮。我见过不少同学第一场笔试翻车但通过复盘、专项强化后后面几场越考越好。算法这条路功夫在平时希望大家都能在这场持续的长跑中找到自己的节奏。