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

携程2025春招开发笔试复盘:题型考点与编程题解析

又到了一年春招季。这周刚参加完携程集团2025年春招开发工程师的第一批笔试趁着记忆还热乎赶紧把整场笔试的情况、题目考点、做题思路和踩过的坑整理出来。这篇不聊虚的全是实操层面的东西给后面几批笔试的同学以及打算投携程或其他大厂开发岗的朋友做个参考。先交代一下背景投的是携程集团的开发工程师岗位base上海笔试用的是牛客网在线笔试系统统一时间开考全程监控摄像头屏幕录制。整体感受是题量适中、难度中等偏上、时间相对紧张尤其是编程题部分需要比较熟练的代码功底才能全部写完。先说结论携程笔试的考察重点集中在计算机基础操作系统、网络、数据库、Java/Go等后端语言基础以及数据结构与算法编程题。算法题以中等难度为主字符串处理、二叉树、动态规划、贪心出现概率很高没有特别偏门的题目但想要拿高分基础必须扎实。1. 整体流程与题型分布1.1 笔试基本信息与时间分配携程的笔试题型整体分为三个部分单项选择、多项选择、编程题。我这场是19:00开考限时90分钟。注意这里有个细节牛客系统是“整卷计时”也就是说选择题和编程题是同一套倒计时不是每道题单独限时所以你必须自己安排好时间别在选择题上磨太久否则后面的编程题会被时间卡死。具体题型分布大致如下题型题量分值占比建议用时单选题15题约30%20-25分钟多选题5题约15%10分钟编程题3题约55%45-55分钟这个时间分配只是参考实际操作中我建议选择题压缩到20分钟内搞定把省下来的时间全部留给编程题。因为编程题的分值占比超过一半而且呈“压轴”性质写出一道是一道性价比远高于纠结一道不确定的选择题。1.2 牛客笔试系统的使用注意事项牛客系统的在线编辑器默认支持Java、C、Python、Go、JavaScript等主流语言我自己用的Java因为携程后端主力语言就是Java笔试用Java写代码也能体现语言熟悉度。这里提醒一句系统支持本地IDE粘贴代码但提交前一定要把代码完整复制回网页编辑器。我见过有同学在本地IDE写完了结果忘了同步到网页端时间到直接交白卷。另外牛客的选择题退出全屏有切屏记录系统会自动检测超过一定次数会警告或标记异常。所以做题时老老实实全屏别手滑切出去查资料。虽然监考机制不是每个岗位都严格但一旦判定作弊整个春招流程就黄了不值得冒险。2. 选择题考点复盘与复习建议2.1 计算机基础考点操作系统与网络这一块考得很正统基本就是大学课程里那些核心知识点。我遇到的有进程和线程的区别问的是同一进程内多个线程共享哪些资源、死锁的四个必要条件、虚拟内存和页面置换算法LRU和FIFO对比还有进程调度算法的应用场景。网络部分出了TCP三次握手和四次挥手的过程问的是TIME_WAIT状态下客户端端口的状态注意是客户端不是服务端还有HTTP和HTTPS的端口号与加密方式的区别。有一道题考了TCP拥塞控制里的慢启动和拥塞避免问发送窗口的变化阈值这种题就是背概念理解流程没有太多弯弯绕。复习建议操作系统死扣进程线程、死锁、页面置换三大块网络死扣TCP三次握手、四次挥手、TCP/UDP区别、HTTP/HTTPS。这几块是笔试选择题的重灾区大厂基本必考携程也不例外。2.2 Java基础考点与多线程问题Java相关的选择题考了HashMap的底层结构JDK 1.8后是数组链表红黑树链表长度超过8转红黑树、ConcurrentHashMap的锁机制、ArrayList和LinkedList的区别以及JDK动态代理的实现方式和CGLIB对比。有一道多线程的题我印象比较深考的是volatile关键字的作用选项里混了“保证原子性”这个错误选项正确答案是“保证可见性和禁止指令重排”。这类题每年都在出但还是有不少人栽在“volatile保证原子性”这个坑里复习时一定要把“可见性、有序性、原子性”这几个词对着概念反复记牢。对于投携程的Java开发岗建议把JVM垃圾回收算法、类加载过程、HashMap和ConcurrentHashMap的源码细节都过一遍。这三项是最常考的Java考点笔试选择题会出面试环节也大概率会被追问。2.3 数据库与SQL基础考点数据库方面考了索引失效场景比如在索引列上使用函数导致索引失效、隐式类型转换等、B树和Hash索引的区别、事务的ACID特性、以及最左前缀匹配原则。有一道题给了一张表问WHERE条件为name 张三 AND age 18时联合索引(name, age)是否生效。这题其实考的就是最左前缀匹配name在最左边所以索引能走但是age是范围条件联合索引里后面的字段在范围查询时无法用于排序和索引下推但索引本身还是走了一部分。这种题在笔试里很典型难度不大但是概念必须清晰。SQL题还考了基础的分组统计用HAVING过滤组的写法以及LEFT JOIN和INNER JOIN的区别都是常见知识点。如果有时间建议把《SQL必知必会》里关于JOIN、GROUP BY、子查询的章节刷一遍笔试完全够用。3. 编程题实战解析3.1 第一题字符串处理简单-中等第一题是字符串处理题目大意是给定一个字符串将其中连续出现的字符压缩成字符出现次数的形式比如aaabbc压缩成a3b2c1但要求如果压缩后的字符串长度不小于原字符串则返回原字符串。这题一眼看上去很简单就是遍历字符串统计连续相同字符的个数然后拼接。但实际上有一个小坑数字拼接后可能让压缩结果更长比如ab压缩成a1b1是4个字符原字符串只有2个字符此时要返回原串。这是题目的关键判断条件少读了“如果压缩后长度不小于原串则返回原串”这个条件就会浪费十几分钟。我写的思路public String compressString(String S) { if (S null || S.length() 2) return S; StringBuilder sb new StringBuilder(); int count 1; for (int i 1; i S.length(); i) { if (S.charAt(i) S.charAt(i - 1)) { count; } else { sb.append(S.charAt(i - 1)).append(count); count 1; } } sb.append(S.charAt(S.length() - 1)).append(count); return sb.length() S.length() ? sb.toString() : S; }重点在于最后返回时的判断sb.length() S.length()才返回压缩串否则返回原串。我提交前特意用aab、ab、aa这几个用例自测了一下确保逻辑没漏。这道题本身不难但很考验细心程度属于笔试里“送分题”的定位不能丢分。3.2 第二题动态规划中等第二题是典型的动态规划题目大意是在一个m x n的网格中从左上角走到右下角每次只能向右或向下走网格中有若干障碍物1表示障碍物0表示可通行问总共有多少条不同路径。这道题就是LeetCode 63题的变体属于动态规划的入门经典题。状态转移方程是dp[i][j]表示从起点走到(i, j)的路径数如果(i, j)是障碍物则dp[i][j] 0否则dp[i][j] dp[i-1][j] dp[i][j-1]边界条件第一行和第一列只能一路向右或向下走但如果中间遇到障碍物后面的格子都不可达需要初始化时特殊处理我写的第一版用了一个二维数组public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m obstacleGrid.length, n obstacleGrid[0].length; int[][] dp new int[m][n]; for (int i 0; i m; i) { if (obstacleGrid[i][0] 1) break; dp[i][0] 1; } for (int j 0; j n; j) { if (obstacleGrid[0][j] 1) break; dp[0][j] 1; } for (int i 1; i m; i) { for (int j 1; j n; j) { if (obstacleGrid[i][j] 1) { dp[i][j] 0; } else { dp[i][j] dp[i-1][j] dp[i][j-1]; } } } return dp[m-1][n-1]; }写完过了一遍测试用例后我又优化了一版用一维滚动数组把空间复杂度从O(mn)降到O(n)。这在笔试中不是必须的但能体现代码功底加分项。笔试环境里没有LeetCode那么完善的测试用例必须自己多构造几个边界用例比如全障碍、起点就是障碍、单行单列等情况。3.3 第三题二叉树路径总和中等偏难第三题考的是二叉树题目大意是给定一棵二叉树和一个目标值找出所有从根节点到叶子节点路径上节点值之和等于目标值的路径。这道题和LeetCode 113几乎一样属于DFS深度优先搜索回溯的经典组合。说实话写到这题的时候时间已经剩下不到20分钟了我整个人是有点慌的。因为前面选择题花的时间比计划多了几分钟加上第二题调试花了几分钟导致第三题的分非常紧张。我当时写的思路是DFS递归遍历维护当前路径和路径和public ListListInteger pathSum(TreeNode root, int targetSum) { ListListInteger res new ArrayList(); dfs(root, targetSum, new ArrayList(), res); return res; } private void dfs(TreeNode node, int sum, ListInteger path, ListListInteger res) { if (node null) return; path.add(node.val); sum - node.val; if (node.left null node.right null sum 0) { res.add(new ArrayList(path)); } else { dfs(node.left, sum, path, res); dfs(node.right, sum, path, res); } path.remove(path.size() - 1); }核心是回溯时要把当前节点从路径中移除不然递归返回上一层时路径就会出问题。这个细节是DFS回溯的关键也是很多人写不出正确答案的原因。我提交时反复确认了new ArrayList(path)这里用了拷贝而不是直接res.add(path)不然结果集会被后续修改影响。这道题我做完了跑了几组自测用例但不确定是否完全正确因为时间太紧没来得及处理空树等特殊情况。不过整体思路是对的拿部分分问题不大。4. 在线笔试的实战策略与时间管理4.1 时间管理先易后难别在一道题上死磕经过这一场笔试我最深的感受是时间管理比做题能力更影响最终分数。选择题155道如果每道题都反复纠结编程题写的时间就会不够。我的策略是先快速浏览所有编程题大概10秒钟判断难度。如果发现第三题是二叉树难题就先把第二题的动态规划写出来因为状态转移方程清晰再回头做第一题字符串压缩。这么安排的原因是第三题即使思路对也可能因为边界条件调试浪费时间不如先把能拿稳的分装进口袋。实际操作中我给自己的“死磕线”是15分钟。一道编程题如果15分钟还没完全理清思路我会先把核心步骤的代码框架写上哪怕只写了主体函数也能拿部分分然后跳到下一题。牛客的判分是按测试用例比例给分的过几个用例就有几分没必要一道题死磕到底。4.2 输入输出与异常处理在线笔试的隐藏陷阱在线笔试和本地面试做题最大的区别是需要处理标准输入输出而且牛客的输入可能有多个测试用例需要循环读取。我第一题就差点在这里翻车。题目要求输入一行字符串但实际测试时会传多组数据如果不写成while (in.hasNextLine())循环读取就只能处理第一组后面的用例全部判错。这种错误太冤了代码逻辑全对结果0分。我写第一题时的标准模板import java.util.*; public class Main { public static void main(String[] args) { Scanner in new Scanner(System.in); while (in.hasNextLine()) { String s in.nextLine(); System.out.println(compressString(s)); } } public static String compressString(String S) { // 核心逻辑 } }这个模板适用于绝大多数牛客单行输入场景。如果是多行数字输入我一般用in.nextInt()配合while (in.hasNextInt())。记住主类名必须是MainJava并且不能声明package否则编译直接报错这可是新手最容易踩的坑。4.3 本地IDE准备与在线编辑器的差异虽然牛客优化了网页编辑器但体验还是远不如本地IDE。我的做法是提前在本地装好IDEA把常用的算法模板输入输出模板、快速排序、二分查找、DFS框架、BFS框架、并查集都准备好笔试时直接复制改改就能用。这样能节省大量手敲基础代码的时间把精力集中在核心逻辑上。有一个细节要注意本地IDE和牛客编辑器的Tab缩进不一致问题。如果你的本地方缩进是4个空格牛客是2个空格粘贴后代码会乱需要花时间重新调整。建议本地也统一用4空格缩进至少在牛客里粘贴后结构不会乱。5. 携程笔试考点画像与后续批次的备考建议5.1 高频考点总结与知识盲区补漏把整场笔试梳理一遍可以给后面几批的同学画一个清晰的考点地图考点类别具体知识点出现频率操作系统进程线程、死锁、页面置换、虚拟内存高计算机网络TCP/UDP、三次握手、HTTP/HTTPS高Java基础HashMap、线程、JVM、集合高Java岗数据库B树、索引失效、事务隔离级别、JOIN中高算法题字符串处理、动态规划、二叉树DFS高其他设计模式、Linux命令、浏览器缓存中如果你离笔试还有几天时间优先补我刚才列出来的高频率考点。其中动态规划建议多刷LeetCode 62、63、64、72这几题是各大厂笔试出现频率最高的DP模板题。二叉树重点看104最大深度、112路径总和、113路径总和II基本就是换皮题。5.2 不同技术栈的同学备考侧重不同如果你是Java方向JVM和并发多线程一定要看携程对Java技术栈的考察明显偏重。如果你是Go或C方向则要多看操作系统底层和计算机网络原理因为Go/C岗位的考题会更贴近系统底层。我自己准备的顺序是先保证数据结构与算法编程题大头再复习计算机网络和操作系统选择题大头最后过Java基础和数据库SQL。这个顺序适合时间紧张的同学能最大化得分效率。5.3 刷题资源和模拟练习建议刷题资源方面LeetCode的Hot 100是必刷的频繁出原题的概率非常高。我之前刷LeetCode 113时觉得不太考结果笔试就出了几乎一样的题。所以建议大家不要把精力放在偏题怪题上经典题刷透考试时看到一个眼熟的思路就能很快写出来。另外强烈建议在笔试前至少做1-2次牛客全真模拟熟悉牛客的系统、计时规则和输入输出处理方式。我第一次用牛客时不知道输入需要循环读取导致第一题部分测试用例没跑过。后来在模拟题里练熟了正式笔试才没翻车。6. 笔试结束后需要注意的事6.1 考后复盘与经验沉淀笔试结束后我第一时间把记得的题目和考点记下来做完复盘。这一步很重要笔试只是一次检验真正的成长来自于你发现自己哪些知识点没掌握然后在面试前补上。我这次的复盘结果是动态规划的状态转移方程掌握得不错但二叉树回溯时对路径拷贝不够敏感选择题里TIME_WAIT状态那道题判断有点模棱两可面试前还得再翻一遍TCP状态转换图。这些盲区正好是面试高频考点笔试其实是免费的摸底测试暴露问题比拿到高分更有价值。如果是面试前才暴露代价就大了。6.2 后续面试准备方向携程笔试通过后一般会有两轮技术面一轮HR面。技术面大概率会围绕项目经历、Java基础、并发编程、分布式系统展开。如果你想提前准备建议把简历上的项目吃透把亮点数据准备好同时把HashMap源码、线程池参数、MySQL索引原理这些高频面试题再背一遍。如果你的笔试成绩不理想也不代表全盘结束。春招批次很多有些部门会根据简历和项目经历综合评估笔试成绩不一定是一票否决。所以简历一定要认真写把项目和实习经历写得具体、有数据支撑能有效弥补笔试分数的平庸。7. 给下一批同学的一些掏心窝建议我这次笔试下来最大的教训是别在小分上丢大分。选择题多花5分钟纠结一道不会的题可能就导致一道20分的编程题写不完这是非常不划算的买卖。碰到没把握的选择题先凭第一感觉选标记一下赶紧做后面的题有时间再回头改。第二个建议是考前一定要睡好。这听起来像废话但晚上7点到8点半的笔试如果你白天还在紧张复习脑子其实已经很疲惫了。状态差的时候简单题都可能犯低级错误比如字符串数组越界、空指针、循环里少了边界判断。基本功扎实的同学笔试比的就是谁更稳、更不容易出错。第三个建议是提前确认笔试链接的网速环境。牛客系统在提交代码时需要联网如果网络状况差代码提交失败会非常崩溃。我当时提前半小时进入系统测试了编辑器和输入框确保页面加载正常稳一手。最后笔试只是春招的一个环节心态放平把这次机会当成学习过程。就算投携程没过同样的准备也可以直接用在其他大厂的笔试题上算法题就是那几大类的循环刷过的题不会亏。祝后面批次的同学们好运咱们面试环节见。
分享:

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

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