
每年秋招携程都是大家重点蹲守的一家因为业务场景丰富、技术栈偏Java、对校招生的培养体系也比较成熟。我投的是技术通用岗9月中旬收到第三批笔试通知考试平台是赛码网整个笔试过程加上复盘前前后后花了一周时间。这篇把题目回忆、解题思路、平台踩坑和复习策略一次性说清楚给后面要考携程或者其他大厂通用岗的同学做个参考。先说结论携程技术通用岗的笔试整体难度在大厂里属于中规中矩没有特别偏门的题目但覆盖面很广。选择题考的是计算机基础编程题考的是算法基本功整体风格很务实没有那种故意刁难人的脑筋急转弯。但恰恰因为务实反而容易在基础细节上翻车尤其是数据结构底层实现、网络协议状态流转这些内容如果平时只刷题不看书选择题会吃大亏。1. 笔试前期准备与信息摸底1.1 从投递到收到笔试通知的关键节点我是8月底在携程招聘官网投的技术通用岗投完之后大概两周收到了笔试邮件。这里提醒一句携程的笔试邀请是按批次发的同一场次内大家的题目是一样的但不同批次之间的题会换。第三批的时间大概在9月中下旬这个节点很微妙因为很多人的算法题感在暑假刷题高峰期后已经开始退化所以保持手感特别重要。收到笔试邮件后第一件事不是闷头刷题而是做三件事确认考试时间、确认考试平台、确认考试范围。携程的笔试邮件里一般会写清楚用的赛码网有的批次还会附上模拟练习链接。我建议至少提前两天去赛码网做一套模拟题不是指望押中原题而是为了熟悉平台的代码编辑器、输入输出处理方式、提交逻辑这些细节。另外要说一下技术通用岗不等于后端岗它是携程对技术类校招岗位的一个统称笔试阶段不会区分Java、C、前端、客户端、算法、数据这些方向所有候选人的笔试题是一套。所以准备的时候不要偏科选择题该复习的内容都得复习不要觉得我投的是Java岗就不用看操作系统。1.2 赛码网模拟与本地IDE准备赛码网这个平台说实话体验一般但它确实是很多大厂秋招笔试的首选平台拼多多、绿盟、微众银行等都在用。它的核心特点有两个第一大部分编程题不是让你在网页里写代码而是需要你在本地IDE里写好之后把完整代码粘贴到网页的代码框里提交第二输出格式要求极其严格多一个空格、少一个换行都可能判错而且它不会告诉你哪个用例错了。所以我强烈建议在笔试前做一次完整的本地模拟流程在自己的电脑上把IDE调好然后去赛码网找一套模拟题按真实考试那样限时做一遍。重点不是看对不对而是感受一下代码从本地到网页的复制粘贴流程、题目描述和输入输出的格式要求。笔试前我还做了一件事把Java的Scanner和C的cin/cout的常见输入输出写法整理成了模板就是为了在考场上节省时间。后面会详细展开这部分。2. 笔试题型全解与考察逻辑2.1 选择题计算机基础轮转第三批笔试的选择题大概是20道左右单多选混合覆盖了计算机网络、操作系统、数据结构、数据库、编程语言基础几个大块。题型本身不新鲜但考察的细节很细我挑几道回忆比较完整的说一下。计算机网络方面考了TCP的三次握手和四次挥手题目给了四个状态迁移场景让你选哪个是合法的。还有一道HTTP状态码的题目给了一堆状态码让你选哪些是重定向相关的这题不难但如果平时记的是3xx是重定向就很容易漏选。操作系统考了死锁的四个必要条件这个比较基础还有一道从进程状态角度分辨时间片用完应该进入哪个状态的题答案是就绪态但很多人会顺手选阻塞态这里考的就是调度器的基本动作。数据库考了一道索引失效场景给了四个查询条件让你选哪个不会走索引这类题只要记住最左前缀原则就不会出错。选择题里还有一个让我印象很深的方向HashMap的底层结构和扩容机制这个题给了一段代码问在JDK8下执行完几个put之后内部数组的容量是多少、某个桶里是链表还是红黑树。说实话这个题平时只刷LeetCode不看书的人大概率答不对因为链表转红黑树的阈值是8、扩容阈值是容量乘负载因子0.75这些细节必须背下来。这也印证了我前面说的大厂笔试的选择题就是在筛基本功。2.2 编程题算法能力检验编程题一共三道难度梯度非常明显第一题是标准签到题大概十分钟内能搞定第二题是中等偏简单的动态规划或者贪心第三题要难一些涉及图或者复杂的模拟。这个出题思路基本和大多数大厂校招一致目的不是让你三道全AC而是通过不同难度来区分候选人的算法能力。三道题的分值占比也值得注意从我的回忆来看编程题总分远高于选择题所以如果选择题有几道拿不准不用慌编程题全AC或者AC两道半基本能进面试。反过来选择题正确率很高但编程题一道都做不出来大概率笔试会被卡。这也是我后面跟大家强调刷题优先级的依据。在回忆真题之前先说明一下赛码网笔试结束后不会公布标准答案所以下面这些题目的描述是我根据自己的回忆和同批次考生的讨论整理的题目大意和考察点是可以确认的个别细节和原题字面表述可能略有出入但不影响参考价值。2.3 SQL题与业务场景结合第三批笔试里还出现了一道SQL题这在技术通用岗笔试里不算罕见。题目的大意是有一个订单表和一张支付表订单表里有订单号、下单时间、用户ID、订单金额支付表里有支付订单号、支付时间、支付状态要求统计每个用户在2023年9月的支付成功订单数和总支付金额按总金额降序排列。这道题本身不难考的是JOIN、GROUP BY、聚合函数和DATE取值但有个小坑支付表是多对一的关系一个订单可能有多条支付记录只有一条是成功的所以直接JOIN会重复计数。正确做法是先对支付表做一次预处理按订单号过滤出支付成功且下单月为2023年9月的记录再和订单表JOIN。这个思路在面试里也经常被问到属于必须要会的基本功。3. 核心真题拆解与一题多解3.1 第一题字符串处理题第一道编程题是典型的热身题题目大意是给定一串由小写字母和数字组成的字符串长度在1到10的5次方之间要求把所有的数字字符按照原来的相对顺序移动到字符串末尾字母字符也保持原来的相对顺序移动到字符串前端输出处理后的字符串。举个例子输入a1b2c3输出就是abc123。这题第一反应是遍历字符串把字母和数字分别存到两个StringBuilder里最后拼接输出。这个解法时间复杂度O(n)、空间复杂度O(n)已经能过了。不过题目既然放在第一题其实是想看看你会不会写双指针原地处理。因为前提条件是输出位置移到末尾很容易想到一个双指针写法用i遍历、用pos记录当前待写入的字母位置如果当前字符是字母就交换s[i]和s[pos]然后pos加一。但要注意这个操作只在所有字母都往前归位时才正确如果要求保持相对顺序就必须用稳定策略比如正序遍历确认字母、倒序遍历确认数字否则相对顺序会乱。我在考场上用的是最稳的StringBuilder两遍遍历方案主要原因是快不容易出错。这里也给大家一个经验第一题的作用是保底不要为了秀操作引入不必要的复杂度。哪怕是O(n)空间只要时间够留在第二题第三题上更有价值。3.2 第二题动态规划与贪心的判定第二题是一道动态规划题题目大意是有一个整数数组每个元素代表你在当前台阶最多能向前走的步数问从数组第一个位置出发能不能走到最后一个位置。这就是经典的跳跃游戏问题。它还有一个变体如果问最少跳几次才能到达最后一个位置那就是跳跃游戏II。这题我第一反应是贪心维护当前能到达的最远位置遍历数组如果当前位置超过最远可达位置说明到不了。如果最远位置已经覆盖到最后一个下标返回true。这样一遍遍历就能解决时间复杂度O(n)空间O(1)。但如果把题目改成最少跳跃次数贪心依然能做只是需要多维护一个当前步数范围内的边界在遍历时更新下一步的最远可达距离边界到达时步数加一。这个解法本质上是在做BFS的分层统计每一层代表一跳能到达的区间范围。这个思路在面试里经常变体出现我把两种版本都在考完以后重新写了一遍思路就清晰很多了。大家在刷题时如果遇到类似题目一定要把一题多解和变体吃透而不是背一道AC一道。3.3 第三题图论与业务场景的结合第三题是三道编程题里最有区分度的一道也是和携程业务联系最紧密的一道回忆起来大概是这样的有N个景点景点之间有M条单向道路每条道路有一个通行时间每个景点有一个游玩时间。现在游客从1号景点出发最终需要到达N号景点问从出发到游玩完N号景点的最短总时间是多少。这道题本质上是带点权的有向图最短路径问题。和标准最短路径的区别在于每个节点被经过时需要额外加上该景点的游玩时间这相当于把点权转化到边权上。转化方式是从u走到v的总代价 dist[u] play[u] edge(u, v)也就是松弛时不仅要考虑边的代价还要考虑当前点的访问代价。如果初始化起点距离时把play[1]算进去后面的转移就是标准的Dijkstra了。我在考场上用的就是Dijkstra加优先队列的写法因为N和M的范围大约是10的5次方所以Bellman-Ford肯定会超时SPFA在最坏情况下的复杂度不稳定容易被卡。优先队列优化的Dijkstra在O((NM)logN)的复杂度下非常稳。这题还有一个细节如果存在负权边就不能用Dijkstra了但题目给定的通行时间肯定都是正数所以不用考虑这个问题。我在考场上这道题没有在第一次提交就过原因是初始化时没有把起点的游玩时间加进去导致后续每个点的距离都少了play[1]。这个错误非常隐蔽本地测试用例如果刚好play[1]是0就测不出来。赛码网的判题也不会告诉你具体哪个用例挂了所以只能自己再检查一遍转移方程。这里也提醒大家赛码网这种不给错误用例的判题方式逼着你必须一次性把逻辑想对靠提交反馈来debug几乎不可能。4. 赛码网笔试避坑与时间分配策略4.1 输入输出处理的坑赛码网题目的输入输出是标准输入输出需要自己写解析逻辑不是LeetCode那种函数填空模式。每道题都对应一个输入格式描述比如第一行输入一个整数n第二行输入n个整数。我考的时候第一题就是这个格式需要在本地IDE里手写读取逻辑然后提交的时候连读取代码一起粘贴上去平台会直接帮你把输入喂进标准输入然后等待你的程序打印输出。这里最大的坑是读入格式如果写错即使算法逻辑全对也会导致运行时异常、输出为空最终被判0分。所以建议每一种输入格式都要准备一个模板常见的有只有一行多个整数、第一行一个整数第二行一组数据、多组数据直到文件结束以及包含字符串和数字混合的情况。把这些模板背下来考试时就能省掉很多试错时间。第二坑是输出格式。赛码网的判题要求输出和标准输出完全一致行末空格和多余换行都可能导致被误判。比如题目说输出一行结果你println多了一个空串通常没事但如果你用了print而不是println多个答案堆积在同一行就会全错。这些细节在平时练习时可以不用太在意但考试时必须注意。4.2 时间分配与答题顺序第三批笔试的总时长我记得是120分钟20道左右选择题加3道编程题再加1道SQL题。时间看起来充裕但实际写起来非常紧张尤其是第三题如果不是一眼就能看出Dijkstra光思考加调试就可能花掉40分钟以上。我的建议是进考场后先快速浏览一遍所有题目对难度有个判断然后按照选择题快速做SQL题第二时间做编程题从易到难的顺序来。选择题遇到一两道拿不准的不要恋战先标记做完后面题再回来看。因为每道选择题的分值是一样的花过多时间在纠结的一道上会挤压掉编程题的时间而后者的权重高得多。编程题的顺序必须是第一题优先第二题其次第三题最后。第一题如果想了五分钟还没思路那说明你没读懂题重新读一次这种签到题一般不会卡思维。第二题如果没思路先考虑能不能用贪心不能用就上DP实在不行也要把暴力枚举的解写出来能过部分用例就是赚。第三题如果前半小时没思路我建议先把基础答案或暴力解提交上去保住部分分数不要一直空着。4.3 本地IDE与编译环境准备赛码网考试支持本地IDE编译然后把代码粘贴到网页提交所以考前把本地的Java、C、Python环境都调好非常关键。我用的Java版本是JDK8因为大多数笔试平台默认也是这个版本用太高版本的语法特性有风险比如JDK11里的某些新特性在笔试环境可能不支持。还有一个很实际的建议把IDE的自动保存关掉或者多按几次CtrlS。我身边有朋友考试时系统突然卡了一下本地代码没保存前二十分钟白写了。赛码网本身对浏览器也有要求最好用Chrome或者Edge提前测好摄像头和麦克风权限因为有些批次需要开启摄像头监控环境检测通不过会导致无法进入考试。另外笔试过程中千万不要反复切换浏览器窗口。赛码网会监测切屏行为短时间多次切屏可能会被警告严重的话后台会收到异常记录影响最终成绩判定。我考试时用双显示器一侧开IDE一侧开浏览器全程不用切屏体验很顺畅。5. 常见问题与后续复盘5.1 高频问题速查表根据我和同批次考生的交流有几个问题是大家在考试前和考试中最常碰到的我整理成了一个速查表问题原因与解决方式输入读不到或者报错先检查是否有多余的空格或换行用nextLine还是next要看清题目描述本地运行对提交0分大概率是读入格式和题目不一致或输出多了引导语句比如println了一行提示文字编程题大概率超时考虑是不是用了O(n^2)的暴力先看数据范围n到10的5次方必须上O(nlogn)或O(n)选择题不确定优先排除绝对错误的选项拿不准的标记后跳过不要影响后续节奏赛码网切屏被警告考试期间不要切换到其他应用提前把浏览器弹窗和消息通知全部关掉摄像头检测不过提前在赛码网做设备检测确保浏览器有摄像头权限5.2 笔试后的复盘与面试衔接笔试结束后赛码网不会立即显示成绩通常要等一到三周才会收到面试通知。我个人建议这段时间不要干等而是立刻进行一轮复盘把笔试中做错的、没做出来的题再重新做一遍。尤其是那些你觉得自己应该会但考场上一紧张卡壳的题一定要找出来。我的经验是笔试暴露出来的问题面试中大概率还会以更深入的形式再考一次。举例来说第三题的Dijkstra如果我考完不复盘面试时如果被问到为什么不用SPFA就会很被动。复盘时我把Dijkstra的堆优化写法、点权转边权的技巧、以及为什么负权边会导致Dijkstra失效都一一梳理了一遍。后面如果进了面试这些就是可以主动输出的项目。万一没有通过笔试复盘后的知识积累也会在后续其他公司的笔试里派上用场秋招本来就是一场多公司的车轮战每一场笔试的经验都能沉淀到下一场。5.3 关于刷题策略的个人建议如果你现在才刚开始准备携程这类大厂的笔试我的核心建议是先保证中等难度题稳定AC再追求难题突破而不是一上来就死磕困难题。拿携程这套卷子来说第二题、SQL题、选择题的基础分如果全拿到差不多可以覆盖到60%以上的分值这个基础打牢了笔试通过率就有保障。具体来说LeetCode的热题100和剑指Offer里的经典题是必刷的重点覆盖链表、二叉树、DFS/BFS、动态规划、贪心、哈希表、滑动窗口这些高频考点。图论至少要把Dijkstra的模板写熟因为携程这种业务和出行场景强相关的公司很喜欢用路径规划来出题模板背下来可以直接套。另外不要忽略复杂度的计算。笔试选择题里有一类题是给代码问时间复杂度的比如递归树、主定理相关的题这种题只能靠理解不能靠背题。最后分享一个小经验笔试那天从考场出来我最大的感受不是题难而是细节太多。从赛码网的输入输出到选择题里那些底层原理再到编程题的边界条件一个环节没处理好就会莫名其妙丢分。所以如果你问我校招笔试最应该准备什么我的答案很简单把基础打扎实把平台用熟练把时间分配好剩下的就是心态问题了。笔试不像面试它不会看你的沟通和临场发挥只会看你有没有把会做的题稳稳做对。能做到这一点你就已经跑赢大部分人了。