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

资讯详情

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

携程秋招笔试全解析:题型分布、算法编程题与备考策略

携程秋招笔试全解析:题型分布、算法编程题与备考策略 每年八月底到九月初是秋招笔试最密集的时间段。2023年携程秋招技术通用岗第二批笔试题目整体风格偏基础、实用覆盖范围是“数据结构与算法 计算机基础 少量场景题”难度在互联网大厂里算中等偏上比字节、阿里要温和一些但比很多中小厂要扎实。当时我全程做下来最直观的感受是算法题不给纯偏题怪题但会在边界条件和数据范围上设一些坑基础题不背定义而是考察你有没有真正写过代码、调过接口、排查过线上问题。如果你是准备投携程技术岗的应届生或者正在备战秋招想了解携程笔试风格的这篇文章值得看完。我会把考核范围、题型分布、做题策略、典型题目的解法思路、以及我踩过的坑全部拆开讲尽量还原真实考场体验。1. 整场笔试的全景拆解科目、题量与时间分配1.1 笔试题型与科目分布2023年携程秋招技术通用岗第二批笔试整体分为两个大模块第一部分是通用选择题第二部分是编程题。选择题方面不区分具体技术方向统一考查计算机基础。题目数量在二十道上下涵盖数据结构、操作系统、计算机网络、数据库四门核心课少量题目涉及Java或C语言特性。没有出现行测、性格测试这类非技术内容整体非常聚焦。编程题部分一般是两道到三道算法题总分值在笔试中占比最高。题目难度呈梯度上升第一题通常是简单到中等偏易的模拟或字符串处理第二题是中等难度的搜索或动态规划第三题则偏向思维题或复杂搜索。2023年第二批笔试的三道题整体考察重心在字符串处理、状态枚举、以及带一定思维难度的贪心/动态规划上。时间安排上笔试总时长一般为120分钟。建议的分配思路是选择题控制在四十分钟以内编程题留足八十分钟。因为选择题个别题存在二义性或者需要动手推演你不能在第一题上恋战否则后面编程题会非常赶。1.2 编程题具体分值分布从笔试平台的计分规则来看编程题通常每题分值相同按照通过的测试用例比例给分不是“全对才有分”。这意味着你的代码哪怕只能过部分case也能拿到一部分分数。这一点非常重要二批笔试第三题难度不低很多人拿零分但如果你能做到暴力解加部分剪枝至少能保底30%到50%的分数。提示不要指望每道题都拿满分。正确策略是保第一题全过第二题尽量全过第三题能拿多少拿多少。1.3 笔试平台与考试环境2023年携程笔试使用的是牛客网系统支持本地IDE调试后粘贴代码也支持在线编辑器直接写。建议提前适应牛客网的输入输出模式所有题目的输入都是标准输入输出也是标准输出不涉及核心代码模式就是不给函数头让你自己读数据这一点和力扣差异很大。平时刷题习惯了力扣的人需要额外练一下IO处理否则光读入就能卡住几分钟。代码提交语言方面Java、C、Python都可以用。我建议用自己最熟悉、最快能写对的语言不需要刻意追求大厂常用的语言。大多数人的问题是代码量不够熟练而不是语言选择本身。2. 选择题的核心考点与实战分析方法2.1 数据结构偏重树与图的遍历特性选择题里的数据结构题目2023年第二批笔试风格是“概念原理 小规模推演”但推演量不大。最常考的方向包括二叉树的先序、中序、后序、层序转换二叉搜索树/平衡树的插入删除过程与时间代价哈希表的冲突处理方式尤其是链地址法、开放定址法的区别图论的邻接矩阵与邻接表在空间、时间上的差异堆的插入、删除、建堆过程及调整次数其中二叉树遍历是每年必考的重点。考场上的常见坑是题目给了一棵树的先序和中序让你推断后序或者给定层序让你判断是否为某棵二叉搜索树的合法遍历。应对技巧是你必须动笔手推不要在心里“空想”结果。这种题一般能推出来但很容易在某个节点上卡住。比如下面这种典型出题方式已知某二叉树先序遍历序列为ABDCE中序遍历序列为DBACE问后序遍历是什么。解题关键是先序第一个节点A就是根节点然后去中序里找到AA左边是左子树DB右边是右子树CE再分别递归处理。手推一遍非常快但如果你跳步很容易误选。图的遍历在笔试选择题中出现时常考“给定邻接表写出从某点出发的DFS或BFS序列”还有就是拓扑排序。这类题难度不大关键在于不要忽略“按编号从小到大的顺序访问邻接点”这种隐含条件。2.2 操作系统进程调度与内存分页是重点操作系统部分在携程笔试中占比不低风格偏基础和实际结合。高概率考查的知识点包括进程状态转换图就绪、运行、阻塞三态以及各状态之间的转换条件进程调度算法先来先服务、短作业优先、时间片轮转、优先级调度虚拟内存和页面置换算法OPT、FIFO、LRU计算缺页次数死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待线程与进程的区别共享地址空间、内核资源消耗、切换成本页面置换算法几乎每年必考。这题本身没有任何难度会画表、会数缺页就能做对。但2023年第二批笔试有一个变形题目的访问序列较长像7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1物理块数给3或4要求比较LRU和FIFO的缺页次数差异。这种题你在草稿纸上推演的时候很容易在一个访问上漏掉置换过程。我的建议是不要在一个题上反复验证超过五分钟写完就过千万别恋战。死锁的判断也是高频考点。有时候题目给出一组资源分配表问当前是否处于死锁状态。这类题的解法是找能完成的进程执行完毕释放资源再看剩下的进程能否继续。只要有一个进程能推进就不算死锁。实操心得操作系统选择题不要把时间花在背概念上。你要做的是把王道考研那本操作系统里的例题全部做完里面大量题就是笔试原题的变体。2.3 计算机网络TCP与HTTP是绝对核心计算机网络题目集中在传输层和应用层TCP的三次握手、四次挥手、拥塞控制是每年必问。具体表现形式的套路包括给定TCP首部标志位问该报文段对应三次握手的哪一次计算一个TCP连接从建立到传输完毕需要多少个RTT滑动窗口机制中发送窗口大小与接收窗口、拥塞窗口的关系HTTP/1.0、HTTP/1.1、HTTP/2.0之间区别尤其是keep-alive、多路复用Cookie与Session的区别和联系三次握手四次挥手的细节很多做题的人容易混淆。比如第三次挥手之后客户端进入TIME_WAIT状态等待2MSL很多同学选择题问“TIME_WAIT为什么存在”会选“保证客户端最后一个ACK能到达服务器”以及“让旧连接的数据包在网络中消失”但有时候只让选一个需要认真读题。TCP拥塞控制中慢启动阈值、拥塞避免、快重传、快恢复这些机制经常揉在一道题里。出题人会给一个初始ssthresh问你经过几个RTT后拥塞窗口增长到多少。这种题没什么特别技巧就是老老实实画窗口变化表注意不要漏掉超时事件后ssthresh减半、cwnd重置的规则。HTTP部分2023年的考题更偏实用一个页面里包含许多小资源文件问HTTP/1.1长连接与HTTP/2.0多路复用各自的加载耗时对比。这里面涉及“队头阻塞”的关键概念。HTTP/1.1下即使使用长连接同一连接上的多个请求也是串行处理的一个资源卡住后面资源全部被阻塞。所以很多网站通过域名分片来绕过这个限制。HTTP/2.0引入多路复用和二进制分帧可以并行传输但TCP层的队头阻塞并没有完全消除。2.4 数据库索引与事务隔离级别必考数据库选择题的数量在两到三题左右考察的范围比较固定事务的ACID特性以及各特性的实现原理隔离级别读未提交、读已提交、可重复读、串行化对应的并发问题B树索引与哈希索引的区别联合索引的最左前缀原则死锁检测与MVCC机制最容易出错的是联合索引和最左前缀原则。题目可能给你一个联合索引(a, b, c)然后问下面哪些查询能够用到这个索引。很多同学只知道“必须包含a列才能走索引”但忽略了在a相等时b可以继续走索引还有范围查询之后列会失效的规则。比如WHERE a 1 AND b 2 AND c 3这个查询里a和b能走索引但c用不到因为b是范围条件。这种细节笔试几乎年年考务必吃透。MVCC和隔离级别也是高频。可重复读级别下什么时候能看到其他事务新插入的数据如果题目组合了“当前读”和“快照读”的场景答案就会完全不同。当前读加锁会看到最新已提交数据快照读则基于事务第一次读时生成的快照。这两个容易混。提示数据库选择题不要只记结论要搭一个自己的推演框架。遇到隔离级别问题就在草稿纸上画几个事务的时间线标出各自读写操作再判断结果是否符合隔离级别定义。2.5 语言特性与场景题2023年第二批笔试的选择题里编程语言相关的题目不多但也有两三道。Java方向主要考察HashMap的底层实现、线程安全集合、JVM内存区域划分C方向常考STL容器的时间复杂度、虚函数表、智能指针。由于是通用技术岗不会只针对某一种语言出题你可以根据自己熟悉的语言选做。场景题一般会结合线上问题比如“线上CPU飙升到100%如何排查”或者“某接口响应变慢可能的原因有哪些”。这种题没有标准答案按优先级排查的思路基本不会错。比如CPU飙升先想到死循环、频繁GC、线程过多、存在长耗时计算这些选项选上基本稳妥。3. 编程题逐题拆解从题意到AC代码3.1 第一题字符串处理与模拟二批笔试的第一题通常是送分题但送得不舒服需要在字符串或者数组上做一定程度的模拟。这类题考察的是“读题是否仔细”和“边界是否想全”而不是“有没有掌握高深算法”。常见出题形式是给你一个字符串序列需要你按照规则替换、压缩或者统计。2023年常见的具体题目类型是“压缩连续相同字符”类似对字符串做一种简单游程编码输出压缩后的字符串。比如输入aaaabbbcc输出4a3b2c。这类题的时间复杂度要求不高O(n)就能过难度在于输入输出边界。因为牛客网是多case输入你需要用循环读入所有测试用例而不是只处理一组。很多第一次用牛客网的人在这里挂掉。我给出一个典型的参考写法Javaimport java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); while (sc.hasNextLine()) { String s sc.nextLine(); if (s.isEmpty()) { continue; } StringBuilder sb new StringBuilder(); int cnt 1; for (int i 1; i s.length(); i) { if (i s.length() s.charAt(i) s.charAt(i - 1)) { cnt; } else { sb.append(cnt).append(s.charAt(i - 1)); cnt 1; } } System.out.println(sb.toString()); } sc.close(); } }这个代码里最值得说的是两个边界点一是while (sc.hasNextLine())这在牛客网多case输入时是必需的二是for循环遍历到i s.length()结束在循环体里做收尾不要漏掉最后一组连续字符。这种写法可以避免在循环结束后再单独处理一次不容易出错。如果输入字符串特别长拼接性能也需要考虑。用StringBuilder而不是直接用String相加这是最基本的要求。实际笔试中如果用的是Python直接用str 也没问题因为Python对字符串拼接做了优化。3.2 第二题状态搜索或二维动态规划第二题一般开始上强度了。2023年第二批笔试第二题从题型来看大概率是二维网格图上的最短路径BFS或者带有条件限制的状态搜索。BFS本身不是难点难点往往在状态定义上搜索时需要维护的信息不只是坐标(x, y)可能还包括“已经使用了某个道具”或者“当前步数奇偶性”这就是所谓的“状态BFS”。出题形式可能是这样的给定一个M x N的网格每个格子上是0、1或其他数字0能走1不能走从左上角走到右下角中间最多能消除k个障碍物求最短路径步数。这道题如果你只用visited[x][y]去重答案是错的。因为到达同一个格子时如果剩余消除次数不同未来的可达性就完全不同。所以visited数组必须带第三个维度visited[x][y][used]used表示已经使用的消除次数。状态总数是M * N * k比较小的时候完全可以用BFS暴力搜完。参考实现Javaimport java.util.*; public class Main { static int[][] dirs {{1,0},{-1,0},{0,1},{0,-1}}; public static void main(String[] args) { Scanner sc new Scanner(System.in); int m sc.nextInt(); int n sc.nextInt(); int k sc.nextInt(); int[][] grid new int[m][n]; for (int i 0; i m; i) { for (int j 0; j n; j) { grid[i][j] sc.nextInt(); } } boolean[][][] visited new boolean[m][n][k1]; Queueint[] queue new LinkedList(); queue.offer(new int[]{0,0,0,0}); // x, y, used, steps visited[0][0][0] true; while (!queue.isEmpty()) { int[] cur queue.poll(); int x cur[0], y cur[1], used cur[2], steps cur[3]; if (x m-1 y n-1) { System.out.println(steps); return; } for (int[] d : dirs) { int nx x d[0], ny y d[1]; if (nx 0 || nx m || ny 0 || ny n) continue; int nused used grid[nx][ny]; if (nused k !visited[nx][ny][nused]) { visited[nx][ny][nused] true; queue.offer(new int[]{nx, ny, nused, steps 1}); } } } System.out.println(-1); } }这题的核心点是visited数组的设计体现你对状态BFS的理解。普通网格BFS只把“坐标”当作状态但这题需要把“剩余技能次数”也纳入状态空间否则会漏解。如果你在考场上一时间想不到三维visited那第二题的结局大概率是答案错误。这种经验只能靠平时多刷“状态压缩BFS”多练“带条件的网格搜索”。力扣上类似题有“二进制矩阵中的最短路径”以及“K站中转内最便宜的航班”可以对照练。3.3 第三题思维题与优化边界第三题是整套笔试卷的分水岭出现的是典型的需要思维转化的题目。常见方向包括贪心加数据结构优化、二分答案或者经过转化后变成一个经典动态规划问题。题目本身阅读量不大但需要能够在短时间内看穿题目的本质。我曾遇到过一个类似题型的变形题给定一个包含正负数混合的数组要求把数组分割成若干段连续子数组每段的和都不超过某个限定值M求最少分割成多少段。这种题大家第一反应是“每个子数组越长越好”于是从左往右贪心地扩展。但贪心在这里可能会出错因为单个元素本身可能就超过了M需要单独处理而且如果允许对数组进行重排那又变成了另一个问题。2023年第二批笔试的第三题基本就是这个难度量级的变种。对于这种题考场上如果你不能在五到十分钟内想出正解直接退而求其次写暴力或者部分分代码。例如用DFS枚举所有可能的分割点然后取合法方案里的最小段数。虽然复杂度是O(2^n)过不了大数据但小数据case能拿到分。考试平台按部分case给分这已经不是秘密。参考一个通用的部分分写法DFS枚举分割点import java.util.*; public class Main { static int n; static long limit; static long[] a; static int ans Integer.MAX_VALUE; public static void main(String[] args) { Scanner sc new Scanner(System.in); n sc.nextInt(); limit sc.nextLong(); a new long[n]; for (int i 0; i n; i) a[i] sc.nextLong(); dfs(0, 0, 0); System.out.println(ans); } static void dfs(int index, int segCount, long curSum) { if (index n) { ans Math.min(ans, segCount); return; } if (segCount ans) return; // 剪枝 if (curSum 0 curSum a[index] limit) { dfs(index 1, segCount, curSum a[index]); } // 新开一段 if (a[index] limit) { dfs(index 1, segCount 1, a[index]); } } }这段代码不是高分代码但它在处理小数据时不会超时能稳定拿分。把所有可能的情况都枚举了只要数据范围在10到15以内基本没问题。笔试系统里这种部分正确代码的得分率远高于你花四十分钟死磕正解但最后编译失败或者超时的结果。3.4 做题顺序与时间控制策略编程题时间分配上我给一个最稳妥的公式第一题20分钟内必须提交通过争取15分钟内解决。第二题40分钟为限超过45分钟没有头绪立刻放弃进入第三题。第三题剩余时间全力做先写出暴力版本保证过小数据case再想优化。实际操作中很多人会陷入“第二题我马上想出来了再做五分钟”的陷阱。这种心态是大忌。笔试考察的不只是你会不会做还有你会不会取舍。你在一道题目上多花二十分钟可能多拿30%的分数但第三题如果因为没时间写暴力直接零分损失更大。还有一个细节是样例测试与提交测试的差异。牛客网笔试允许你在本地IDE运行通过样例测试后再粘贴到系统里。强烈建议所有代码先在本地跑通样例再粘贴到提交框不要在在线编辑框里直接写长代码一旦网络波动或者误触刷新全部白写。4. 备考准备与线下实战经验补充4.1 明确优先级刷题与基础必须并行围绕携程笔试的备考时间分配上我建议六成刷题四成看基础。不要相信“只刷力扣就能过笔试”这种话。力扣题目是给单个函数体输入输出不需要你自己处理这导致很多人长期不练IO处理一到笔试平台就露馅。刷题的重点方向按优先级排序是字符串处理、二叉树、图BFS/DFS、动态规划背包、区间、状态压缩、贪心、排序最后是高级数据结构。力扣热题HOT 100里前60题做完笔试第一题和第二题基本就稳了。第三题则需要额外拓展建议专门刷“牛客网历年大厂笔试真题”重点关注携程、美团、拼多多这些互联网公司的题目风格非常接近。4.2 网测环境的预演输入输出与多case处理笔试当天最大的隐性杀手是输入输出格式。力扣核心代码模式与牛客网ACM模式的差异是很多人第一次参加笔试就挂掉的直接原因。你需要提前熟悉以下几个固定范式单行读入一个整数多组数据用while循环处理第一行输入n、m接下来n行每行m个值输入一行字符串可能包含空格用nextLine读取输出结果后是否需要换行一般都要如果你用的是Java不要用next()读一整行字符串它会按空格截断。应该用scanner.nextLine()并注意吃掉上一行遗留的换行符。Python则要注意input()在文件末尾会抛EOFError用sys.stdin.read().split()可以避免很多问题。提示考前一天找一个模拟平台做一套完整的ACM模式题目不求数量求完整体验。建议用牛客网自己的模拟笔试功能把读数据、处理、输出的全套流程走一遍。4.3 心态与考场细节笔试是秋招第一道门槛很多人败在心态而不是题目难度上。单独一道题卡住不一定代表整体发挥不好关键在于你能否及时跳转。考场上的额外建议笔试前把电脑充好电网络稳定关掉所有可能弹窗的软件。准备草稿纸和笔。有些题目画图推演比空想快得多。每道编程题提交前多考虑一下边界值空字符串、单元素数组、最大数据范围、全部相同元素等。如果题目不限制输出顺序尽量按字典序排序后再输出避免因输出顺序不匹配被判错。还有个容易忽略的点携程笔试选择题部分某些题是不定项选择多选、少选、错选均不得分。这种情况如果你不确定尽量不要冒险多选。不过2023年二批笔试不定项选择数量不多多数是单选但仍然要看清楚题干表述。4.4 后续面试可能会问到的笔试关联点笔试之后面试官可能会针对你的笔试代码追问思路尤其是第二题和第三题。建议笔试结束后把每道题的思路整理成文字尤其是你当时的解题想法、有没有尝试不同方案、复杂度是多少。面试时如果你的回答是“我笔试卷子上直接写的”“不确定复杂度假”这种容易让面试官觉得你的算法功底不扎实。特别是第三题面试官问的往往不是“这道题怎么写”而是“你当时为什么最终选了这种解法有没有考虑过另一种优化”。你要能回答出二分答案的依据、单调性的证明思路或者暴力版本在数据量增大后复杂度如何爆炸。这些在笔试时可能来不及写但事后复盘一定要补上。5. 常见问题与排查技巧笔试当天可能遇到的那些坑5.1 程序本地能跑提交却编译失败这类问题的根源九成是Java或C的类名问题。牛客网要求Java主类必须命名为Main不要带package语句也不要public class后面跟别的名字。C则注意不要使用本地编译器支持但评测机不支持的新特性比如C17的std::optional。Python虽然一般没有类名问题但要注意版本差异。评测机大多数是Python 3.8左右如果你用了3.10才支持的语法比如match语句直接编译失败。5.2 样例通过提交却0分遇到这个情况优先考虑三种可能性没有用while循环读入多组数据只处理了一组。数组越界导致运行时异常牛客网统一判为0分。精度问题比如要求输出浮点数但输出格式与答案不一致。其中数组越界是最常见的。笔试时你本地测的是小样例数组刚好够用但提交的数据范围更大越界直接RE。建议对数组长度大于等于数据范围上限再加5到10的余量这是最朴素的防御性编码。5.3 运行超时怎么判断是代码问题还是平台问题运行超时基本就是算法复杂度太高。你可以先看数据范围数据是10^5级别你的解法是O(n^2)那一定超时。这时候别想着优化常数直接换思路。二分、排序、前缀和、双指针、哈希表这些O(n)或者O(n log n)的工具是解决超时的主要武器。如果已经写了O(n log n)的解法还在超时再考虑是不是输入输出的问题。Java使用Scanner读10^6级别的大数据确实会比较慢可以换用BufferedReader自己解析。Python则建议用sys.stdin.buffer.read()来一次性读入再split。这种输入输出层面的优化有时能将耗时降低一半以上。5.4 选择题存在争议选项怎么办非技术内容的选择题有时候会出现两个选项都说得通的情况。这时候不要纠结按最主流的结论选。比如TCP相关题目有些教材对某个细节的表述不同但笔试命题人一定按照最常见的那本教材出题。以王道或者谢希仁版《计算机网络》为准基本不会错。如果你判断某道题可能有问题做完就略过不要反复回头修改。在不确定的题目上消耗过长时间只会拖累后面的编程题。6. 从第二批笔试反推携程的招聘偏好6.1 技术通用岗看重扎实基础而非偏题怪题从2023年第二批笔试的题目设置来看携程技术通用岗非常看重应聘者的计算机基础是否扎实。选择题覆盖的课程范围很标准难度不算高但知识点密集。这意味着如果你本科学的课程体系比较完整不需要特意准备就能答对大部分反之如果基础薄弱临时抱佛脚很难在短期内补齐。编程题部分没有刻意追求难题除了第三题之外前两题都是经典的算法题变形。这传递出的信号是携程希望候选人具备“遇到常见问题能够快速写出可运行代码”的基本工程能力而不是只看重竞赛型解题能力。6.2 业务导向场景题与工程化思维并存选择题里出现了一些线上排查类的场景题比如接口变慢、CPU飙升这类说明携程在招人时比较关注候选人的工程思维。虽然笔试阶段占比不大但如果你能在评论区或面试时展示出对这类问题的思考会是一个明显的加分项。秋招笔试只是第一步通过笔试之后的技术面会更加关注你在项目中的细节、系统设计的能力、以及在压力下排查问题的能力。笔试题其实就是一个引子方便面试官在后续环节继续深挖。对我个人来说携程笔试给我最大的启发是大厂笔试不是比谁刷的题多而是把计算机基础、算法能力和工程思维放在同一张卷子里综合考查。第三题不会做不丢人但前两题因为边界条件或者输入输出处理失误而丢分就太可惜了。如果你准备时间有限先把所有基础选择题的经典考点过一遍再练熟三道经典题型的AC解法通过概率会提升得非常明显。最后再说一个容易被忽略的小技巧笔试结束后立刻把第三题当时卡住的地方搜一遍题解理解透。这套题后续在面试时被追问的概率很高提前消化远比等到面试前一天临时补要从容。祝你顺利通过笔试后面还有更多挑战等着你。
返回列表