尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

携程秋招研发岗笔试经验:四道算法题与备战策略

携程秋招研发岗笔试经验:四道算法题与备战策略 又到了一年一度的秋招季后台和群里陆续有读者问携程的笔试情况。作为过来人我把自己参加2023年携程秋招研发岗第一批笔试的经历和复盘整理出来希望能给正在准备大厂笔试的同学一些参考。这篇文章会从笔试整体结构、四道编程题逐个拆解、容易踩的坑、再到备战建议尽量还原真实的笔试现场。1. 携程秋招笔试的整体情况与题型分布先说结论携程研发岗的笔试整体难度在互联网大厂里属于中上水平比基础校招难一些又比顶级算法岗温和不少。对比同期的拼多多拼多多笔试出了名的题量大、时间紧、微众银行的数分笔试侧重统计学和SQL携程的研发笔试更看重基本功和代码实现速度。2023年携程秋招研发岗第一批笔试采用的在线考试系统是赛码网。这里多说一句赛码网和牛客网是秋招笔试的两大主流平台携程虽然偶尔用牛客但2023年研发岗基本都在赛码网上考。如果你之前只在牛客刷题建议提前去赛码网熟悉一下环境尤其是它的代码编辑器、输入输出样例切换和调试窗口布局别到了考场上才第一次打开。笔试时长是120分钟题量固定为4道编程题其中第一题是简单的签到题后面三道逐渐过渡到中等难度。没有选择题没有填空题纯算法题。这个设置其实很直白考察的是你在有限时间内的代码实现能力而不是背诵八股文的能力。仔细回想一下这个题型分布和同批次的联想硬件技术笔试、绿盟科技校招笔试绿盟技术笔试偏安全基础和少量编程都不太一样携程四道题全部是算法实现没有任何八股内容哪怕你Java基础八股背得滚瓜烂熟代码写不出来就是零分。这对平时刷题量不足的同学是致命打击对刷题多的同学则是友好环境。我记得当时考完和群里几个朋友交流大家的共识是前两题必须全过第三题争取全过第四题能骗一点分就骗一点分这样才能保证笔试过线。笔试成绩本身不直接算分排名而是按通过用例的比例来判定。这意味着部分通过的代码也能拿到不少分所以考试策略格外重要——如果没有思路完全放弃那才是一分都拿不到。提示赛码网提交后不会立刻显示判分结果需要等全部题目提交后或者整场考试结束后才能看到成绩。所以考试时不要反复纠结某一题的通过率先稳住其他题再说。2. 四道编程题逐个拆解与解题思路下面按照笔试顺序我把四道题的核心考点、输入输出特点、典型的解法思路以及我在现场是怎么思考的逐一还原出来。由于每批次题目可能不同但题型风格和考查方向有很强的延续性这里重点讲思路而不是背答案。2.1 第一题字符串处理类签到题这一题是标准的暖场题难度不高但要求你不能轻敌。题目大致是给定一个字符串要求做某种字符替换或子串判断比如判断一个字符串是否满足某种密码规则或者把字符串中的某些字符按规则转换。这类题的核心考察点有三个String/char数组的基本操作、对边界条件的敏感度、代码格式规范。从笔试现场看很多人第一题反而拿不到满分原因不是不会做而是没有考虑空字符串、单字符、全字符匹配、大小写混杂等边界情况。我当时写题的时候刻意先花一分钟在注释里列出边界条件再动笔写代码。比如如果题目要求判断密码是否合法那验证条件就包括长度下限、是否含大写字母/小写字母/数字/特殊字符中的几种、是否有连续重复字符等。把条件列清楚写代码时一个条件一个分支逻辑就会非常清晰不容易漏判。代码实现上我推荐直接用Java的String类方法不含糊也不用过早考虑性能优化。签到题的数据量一般很小可能只需要 O(n) 的算法正则表达式也能过只要你写得对。当然如果你用C注意一下std::string的遍历和字符判断函数用起来也比裸char*安全得多。以下是我在第一题里常用的代码骨架你刷题时可以用这个思路快速建立解题模板public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); String s sc.nextLine(); // 1. 处理空串和极短输入 if (s null || s.length() 1) { System.out.println(false); return; } // 2. 遍历字符按条件分支判断 boolean flag true; for (int i 0; i s.length(); i) { char c s.charAt(i); // 具体规则... } // 3. 输出结果 System.out.println(flag); } }注意赛码网对Java主类的名称有规定一般是Main类名写错会直接编译失败这个细节要刻进脑子里。2.2 第二题模拟与哈希表结合的中等题第二题就开始上强度了常见的是模拟某种业务场景配合哈希表做计数或去重。携程的业务属性决定了它的题目经常会和旅游、酒店、机票、订单这些场景结合比如根据一批订单信息统计用户行为次数或者合并区间、删除重复元素之类的变体。这道题不像第一题那样“一眼出答案”需要你先读懂题意抽象出数据结构。我印象很深的是做题时遇到一个类似“用户访问日志统计”的题要把输入的多行记录按用户ID聚合。如果直接嵌套循环暴击时间复杂度就会飙到 O(n^2)当数据量到十万级就会超时。所以必须用HashMap来聚合数据将读取与统计合并成一次遍历。这道题推荐的解法步骤是先判断用的是哈希表、哈希集合还是哈希映射表一般统计分析用HashMapK, V去重判断用HashSetK。注意题目要求的输出顺序有时需要排序有时按首次出现的顺序输出。如果按首次出现顺序可以配合LinkedHashMap不要盲目用HashMap它不保证顺序。细节题眼在于“多次输入中的去重”这时要养成先查containsKey的习惯。这部分是拉开差距的开始。能快速识别出“模拟哈希”这两个词就基本赢了一半。面试中很多同学对哈希表的复杂度很熟但一旦题目换成业务外壳就反应不过来底层需要什么数据结构这就是缺乏抽象能力。平时练习时建议养成一个习惯读完题先问自己两个问题——这个题的数据结构是什么遍历之后我需要保留什么信息问完这两个问题思路基本就清晰了。2.3 第三题动态规划或二叉树的经典变体做到第三题已经进入中等偏上的难度区。据我这批的经验第三题大概率考的是动态规划DP或者二叉树的遍历变体例如树的层序遍历变形、最近公共祖先变体。题目不会直接告诉你“用DP”而是包装成一个业务场景比如规划最优路线、安排会议室时间或者求子数组的最大和等。这里我要特别强调携程的DP题考得很正统不会出偏题怪题但会怎么变幻场景来增加理解成本。做题时要先把场景剥离开识别出状态定义和转移方程。比如看到一个题要求“最小消耗”或“最大收益”第一反应就应该是DP或贪心看到“子数组”“子序列”关键词可以考虑前缀和、滑动窗口或DP。以背包类问题为例典型的状态定义是dp[i][j]表示前 i 个物品在容量为 j 的情况下的最优值。笔试时如果时间紧可以先尝试二维DP直观、好写、不容易错如果发现数据范围过大导致空间溢出再优化成滚动数组或一维DP。我自己的习惯是先保证能过样例再考虑超时优化不要一上来就追求最优解结果写了一堆代码反而出bug。二叉树类题目则更考察递归和迭代两手都要硬尤其要注意非递归遍历中栈的使用、空指针判断、递归深度过大时是否需要转成迭代等问题。笔试环境里递归深度超过一定范围会栈溢出所以如果题目的树很深尽量用显式栈或队列。这道题是四道题里最需要冷静分析的一道很多人在这里卡了二三十分钟最后不得不放弃第四题非常可惜。我的策略是给第三题定一个15分钟思考上限超过15分钟没有完整思路就先写暴力解用最笨的办法拿部分分保底再说。比如DP没思路那就用递归 剪枝去实现分析不了最优解那就枚举所有可能取值。部分分也是分别赌气在一棵树上吊死。2.4 第四题压轴的图论或复杂数据结构题第四题属于拉开差距的压轴题通常涉及图论最短路径、拓扑排序、并查集、线段树、单调栈这类进阶数据结构。这题的目的不是让你拿满分而是筛选出真正有竞赛经验或算法功底扎实的候选人。以图论为例出题人经常考察网格图中从起点到终点的最短路径变体比如加入障碍物、不同格子不同消耗、允许一次性特殊操作等。这种题不能直接用朴素BFS可能要上Dijkstra、双向BFS、状态压缩BFS甚至分层图最短路。我当时遇到的就是一个需要分层图思想的题因为可以有限次“跳跃”越过障碍物所以状态空间要扩展一维记录已经使用过的特殊操作次数。这种题目非常考验临场分析能力。如果考场上只有十五分钟建议按优先级做这几件事快速判断数据范围猜测期望的时间复杂度。明确节点数量、边数量、起点终点画出简单的状态转移图。如果实在没有最优解思路尝试写暴力枚举或DFS通过一部分小数据用例能拿多少是多少。比较现实的是大多数候选人在第四题上只能做出第一问或小规模数据部分所以不用因为第四题AC不了就灰心。笔试是一个相对评价机制前三题稳住第四题哪怕只通过20%的用例也大概率能进入面试环节。3. 赛码网笔试环境还原与关键配置前面提到过携程研发笔试用的平台是赛码网。很多同学在牛客上刷题已经很顺手但一换到赛码网就各种不适应这种非技术因素造成的失分是很亏的。下面把赛码网笔试环境的关键点讲清楚。3.1 赛码网与牛客网的主要差异赛码网的界面比牛客更简洁一些左侧是题目描述和样例右侧是代码编辑区底部有控制台输出。它有几个特点需要适应代码自动保存赛码网有自动保存机制但保险起见建议每写完一段核心逻辑就手动CtrlS防止浏览器崩溃或网络波动。没有实时判题反馈提交后通常不会告诉你“通过了多少个测试点”只有考试结束后才出总分。这就意味着你不能通过反复试错来逼近正确答案必须一次写对的能力很重要。多语言环境版本偏旧赛码网对Java的支持虽然相对完善但版本不一定是最新的。我当时就是在这里踩了坑我本机用的Java 17代码里用了var和String.repeat()结果赛码网编译器根本不认直接编译失败。这个教训非常深刻所以我额外提醒一下考试前最好把代码的语言版本兼容性想好尽量用最保守的写法比如Java 8的语法就足够了。3.2 输入输出模板要提前准备好赛码网和牛客类似输入是标准输入输出是标准输出。强烈建议在考试开始前就把输入输出模板背熟不要临时查。在线笔试没有自动补全的IDE也没有快捷键提示如果连模板都在脑子里现拼效率会低很多。Java的常用输入模板就是Scanner好处是易读、方便缺点是处理大输入时会稍慢但笔试范围通常可控。如果发现数据量极大再用BufferedReader优化一次。C的模板就一句话#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 业务逻辑 return 0; }笔试时建议就用最熟悉的语言、最熟的标准模板别在考场上尝试新技巧。3.3 赛码网的常见翻车点多轮考试做下来赛码网最容易翻车的地方有几个多组输入测试用例没有循环读取只处理了一组数据就结束程序导致通过率为0。题目明确说明输入包含多行需要读到文件尾EOF结果用了nextInt()而不是hasNext()判断。提交语言选错比如明明写的是Java代码语言选择却停留在Python导致判分器无法编译。输出多了一行调试日志或打印了一个提示语句哪怕你本地跑得再对判分也是错的。注意在线笔试环境千万别print任何和答案无关的内容判分系统比较死板只认标准输出。4. 考场上容易踩的坑与应对策略很多人觉得笔试就是比算法能力但实际考下来会发现算法只占七成剩下的三成是策略、心态和临场细节。这一节聊聊我在考场上踩过以及看到别人踩过的坑。4.1 读题不仔细样例看一半就开写这是笔试第一大忌。看到题目跟之前刷过的某道题相似就默认解法一模一样结果写完了才发现题目要求不同。比如同样是将字符串按某种规则转换但一个要求保留原始顺序另一个要求按字典序排序如果你默认成刷题时的版本样例都过不了。我自己的习惯是读题读两遍第一遍通读第二遍划重点尤其是“最多”“至少”“按顺序”“不重复”“不能超出”这些限定词。把样例手动推演一遍确认自己理解正确再写代码。很多人为了省两分钟最后多花二十分钟返工得不偿失。4.2 没注意数据范围导致超时或溢出笔试输入数据范围决定了你该用哪种算法。有些题看起来很简单暴力循环就能过样例但数据范围可能到10^9这不仅超时甚至会产生整数溢出。用Java的同学尤其要小心int溢出是笔试中高频翻车点建议涉及数值累加的场景直接使用long。同时时间复杂度要心里有数。我记得有同学第三题用的DFS递归样例通过但提交时因为数据量稍大只过了20%的用例剩下的全部超时。如果你在题目描述里看到数据量很大就应该第一时间考虑动态规划、贪心、数学公式等更优的方法而不是抱着暴力解硬刷。4.3 忽略极端和边界条件边界条件处理是笔试里区分“会写代码”和“代码写得好”的分界线。很多人的代码在主流程上没问题但输入为空、只有一个元素、所有元素相同、输入最大值等情况一出现就崩了。简单粗暴的应对方法是所有数组和链表处理都先判空递归函数先判终止条件循环里注意索引越界。这些处理不是事后补救而要当成代码的一部分写主逻辑之前就先想好边界值应该返回什么。4.4 磕题时间分配不合理笔试时间120分钟合理的时间分配大概是第一题不超过15分钟第二题不超过30分钟第三题不超过40分钟剩下的时间都给第四题和检查。如果一道题卡了20分钟还没有任何突破性思路建议果断跳过先做后面的题目。这里分享一个我在大厂笔试题里摸索出来的方法放弃全A执念追求总分最大化。设想一下如果第三题你死磕了40分钟终于AcceptedAC但第四题完全没有动过那么总分可能只有70分如果你第三题只写了个暴力解拿了30%的分但第四题做了个朴素版本拿了50%的分折算下来总分反而可能更高。笔试拼的是总分不是单题完美。4.5 编译环境与本地IDE的差异平时在本地IDEA或VS Code里写代码有自动导包、语法提示、实时编译报错到了赛码网这种在线编辑器这些辅助全没了。很多人一上来很不适应连类的 import 都会漏写。解决方法是平时刷题时就刻意用在线编辑器练一练或者在本地打模板时把常用的import java.util.*;一起写好进考场先甩上去。我在实际笔试时第一件事就是把输入模板和常见import列在编辑区顶部写完再开始读题这样心理上也会稳很多。5. 备战建议针对携程风格的定向刷题思路如果你正准备下一年的携程秋招或者还在秋招的大队伍里摸爬滚打可以参考下面这几个定向刷题方向。这些方法并不只适用于携程对拼多多、微众银行等大厂笔试也很有效。5.1 按题型分配刷题时间不建议天天只刷自己擅长的题型那会产生能力错觉。以我自己的学习曲线为例提前两个月开始系统刷LeetCode按题型权重分配原则是简单题保持手感中等题大量训练困难题熟悉套路。字符串处理、模拟、哈希表占比30%每天至少2-3道训练代码速度和边界敏感度。动态规划占比25%背包、子序列、区间DP是重点反复做直到能独立写出转移方程。树与图论占比25%二叉树遍历、最近公共祖先、最短路径、并查集是高频考点。贪心、滑动窗口、前缀和等技巧题占比20%它们经常作为前三题的核心解法出现。5.2 针对携程业务场景做关联联想携程是OTA在线旅游平台它的业务天然适合出一些与旅游、机票、酒店、订单、搜索推荐相关的算法题。比如酒店的房源分配问题、机票的行程拼接问题、订单的按时间合并问题。平时刷题时可以把LeetCode的标准题和这些业务场景挂钩模拟“场景化题目”的思考方式。比如合并区间这个题在携程笔试里可能包装成“多个订单的时间区间合并”LRU缓存可以改成“最近访问的酒店推荐”TopK问题可以改成“热门目的地排行”。场景换了但内核不变。你如果在刷题时就做过这层联想考场上看到大段无关的业务故事就不会慌。5.3 多参加模拟笔试很多同学在校招季都是第一次用赛码网笔试这种“第一次”本身就是风险。建议至少提前两周做一次全真模拟限定120分钟完整做四道题感受连续思考的脑力消耗。模拟时注意记录自己做每道题的时间看看时间分配是否合理。如果找不到整套的携程真题可以拿LeetCode周赛的题目组合代替前两题对应签到题和中档题第三题对应DP或树第四题对应图论或难题。坚持几次就能培养出考试节奏。5.4 纠错本比刷题数量重要每天刷完题后花20分钟把错误原因分类。常见是四类边界条件没考虑、复杂度分析失误、题意理解偏差、代码语法错误。分类记录之后你会发现自己重复犯的坑其实就那么几个。比如我当年最大的坑就是Java里用了不兼容旧版本的语法导致编译失败记录在纠错本上后后续每次笔试提交之前都会先检查这一点。另外真题中看到的“数据范围”信息特别重要建议把每道题的数据范围也记在纠错本里以后看到类似的范围提示就能条件反射式地判断思路方向。6. 笔试之外后续面试和Offer选择的思考笔试只是秋招的第一道关卡过了笔试之后还有好几轮技术面、HR面甚至加面。如果笔试成绩不错进入面试时建议准备好项目经历、实习经历、八股文基础以及一定的系统设计能力。面试中经常会被问到笔试原题或变体。如果笔试时某道题是靠暴力骗分过的事后一定要把正确解法吃透不然面试官问起来就露馅了。从这个角度看笔试题目本身也是“练兵场”考完之后复盘的价值甚至比考试时还大。另外笔试过程中要提前规划好人设定位你是把携程当保底还是首选是想做业务研发还是中间件研发如果你对自己想去的方向和部门有清晰的认知从笔试阶段就可以有针对性地展示能力。比如对后端研发岗第三题的DP能力和第四题的图论能力是加分项但如果是前端方向前两题的字符串和模拟能力反而更关键。不要因为一题没AC就否定自己携程笔试衡量的维度比你想的宽。顺带说一句同批次有朋友同时参加了拼多多和微众银行的笔试相比之下携程的笔试已经相当“温柔”了题量适中、难度梯度合理而且不搞偏题怪题。只要平时基础扎实、刷题量足够通过笔试进入面试是完全可行的。最后把一个多月来最深刻的体感总结给你笔试当天一定要提前半小时进入考试环境检查浏览器兼容性、网络稳定性以及衣着舒适度。考试中如果某道题卡住深呼吸按计划跳题。如果时间不够优先把每道题的第一问做出来把部分分拿稳。把每一次笔试试错当作积累下一场一定会更从容。
返回列表