news 2026/9/1 9:20:32

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
携程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()才返回压缩串,否则返回原串。我提交前特意用aababaa这几个用例自测了一下,确保逻辑没漏。这道题本身不难,但很考验细心程度,属于笔试里“送分题”的定位,不能丢分。

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 List<List<Integer>> pathSum(TreeNode root, int targetSum) { List<List<Integer>> res = new ArrayList<>(); dfs(root, targetSum, new ArrayList<>(), res); return res; } private void dfs(TreeNode node, int sum, List<Integer> path, List<List<Integer>> 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 时间管理:先易后难,别在一道题上死磕

经过这一场笔试,我最深的感受是:时间管理比做题能力更影响最终分数。选择题15+5道,如果每道题都反复纠结,编程题写的时间就会不够。

我的策略是先快速浏览所有编程题,大概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())。记住:主类名必须是Main(Java),并且不能声明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点半的笔试,如果你白天还在紧张复习,脑子其实已经很疲惫了。状态差的时候,简单题都可能犯低级错误,比如字符串数组越界、空指针、循环里少了边界判断。基本功扎实的同学,笔试比的就是谁更稳、更不容易出错。

第三个建议是提前确认笔试链接的网速环境。牛客系统在提交代码时需要联网,如果网络状况差,代码提交失败会非常崩溃。我当时提前半小时进入系统,测试了编辑器和输入框,确保页面加载正常,稳一手。

最后,笔试只是春招的一个环节,心态放平,把这次机会当成学习过程。就算投携程没过,同样的准备也可以直接用在其他大厂的笔试题上,算法题就是那几大类的循环,刷过的题不会亏。

祝后面批次的同学们好运,咱们面试环节见。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 9:18:06

WeChatMsg:微信聊天记录怎么导出?3步本地搞定

WeChatMsg&#xff1a;微信聊天记录怎么导出&#xff1f;3步本地搞定 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/We…

作者头像 李华
网站建设 2026/9/1 9:14:53

测试开发高频笔试题全解析:从MySQL优化到LRU手写

上周整理资料的时候翻出一份2023年贝壳找房春招测试开发工程师的笔试卷&#xff0c;仔细做了一遍&#xff0c;发现这套题出得很有代表性。里面既有数据库、算法、网络这些计算机基础&#xff0c;又嵌了不少 Python、Java、Linux 的工程细节&#xff0c;问答题更是直指测试开发日…

作者头像 李华
网站建设 2026/9/1 9:14:14

Ollama与BGE-M3实战:本地大模型+知识库构建RAG问答系统

简介&#xff1a;面向需要搭建本地知识库智能体的AI应用开发者&#xff0c;这份代码包提供了一套以Ollama为核心的大模型部署方案&#xff0c;涵盖与BGE-M3嵌入模型、Vllm、Dify以及本地DeepSeek大模型的对接集成。内容覆盖Ollama安装配置、模型目录调整、模型选择与下载、端口…

作者头像 李华
网站建设 2026/9/1 9:09:11

基于Python与NLP的股市热点板块自动化复盘分析

如果你在周五收盘后打开行情软件&#xff0c;面对满屏的板块涨跌幅&#xff0c;最想解决的事情通常只有一件&#xff1a;明天开始到底该重点跟踪哪些方向。市场上“8月14日星期五&#xff0c;五大热点板块前瞻”这类标题很常见&#xff0c;它能把信息差压缩成一句结论&#xff…

作者头像 李华
网站建设 2026/9/1 9:04:24

C++实现TwinCAT ADS通讯:环境配置、API调用与性能优化实战

简介&#xff1a;针对工业自动化场景中上位机与Beckhoff控制器通信需求&#xff0c;这份资料面向C工程师与Twincat初学者&#xff0c;聚焦于在VS2008环境下利用ADS协议打通PLC与PC的数据交互&#xff0c;涵盖同步、异步、定时及通知等多种通信方式。压缩包内共57个文件&#xf…

作者头像 李华