2023携程秋招技术通用岗笔试复盘:考点、编程题与避坑指南
2023年秋招那会儿,我投了携程的技术通用岗。说实话,当时投这个岗位,主要是看中它“通用”两个字——不像有些厂把后端、前端、算法分得特别细,通用岗意味着笔试范围广但不深,反而适合我这种项目经验一般、但基础还算扎实的选手。结果真到笔试那天,还是被赛码网的界面和题量打了个措手不及。这篇就把2023年携程秋招技术通用岗第一批笔试的全过程、踩过的坑、复盘出来的重点,一次性说清楚。
1. 笔试基本信息与整体策略
1.1 岗位定位与笔试通用规则
携程的技术通用岗,本质上是一个“大池子”招聘逻辑。你投进去之后,不会立刻绑定具体的后端/前端/客户端方向,而是先通过一轮统一的笔试筛选,再根据你的简历、笔试成绩、面试表现来定岗。这种模式的好处是:你不需要在投简历那一刻就把自己锁死,坏处是:笔试题目得覆盖多个方向,你复习的时候没法押宝某一个知识点。
2023年这批笔试,时间是安排在9月上旬,线上进行,用的是赛码网。整场笔试时长是90分钟,题量大概在20道选择题加2道编程题左右。选择题部分是四选一,覆盖计算机基础、操作系统、网络、数据库、Java/C++语言特性、算法与数据结构;编程题则是标准的ACM模式,需要自己处理输入输出,支持Java、C++、Python等主流语言。
这里有一个比较关键的细节:赛码网的编程题环境,默认是“核心代码模式+ACM模式混合”的,第一道往往偏简单,考字符串处理或模拟,第二道直接上算法,考图论或动态规划。所以如果你是第一次用赛码网,强烈建议提前去它的练习场做几道题,把输入输出模板背熟,不然光调试输入格式就能耗掉20分钟。
1.2 时间分配:90分钟怎么撑到底
我说一下我当时的真实时间分配,你可以直接抄作业:
- 前5分钟:快速浏览全部题目。选择题扫一遍,标注出哪些是直接能秒选的、哪些需要动笔算、哪些完全没把握。编程题两道的题目描述先读一遍,心里预估难度。
- 接下来40分钟:做选择题。优先做有把握的,遇到卡壳的超纲题先跳,别恋战。一个题如果超过2分钟还没头绪,果断标记后跳过。
- 最后45分钟:留给编程题。先做简单那道,确保拿到基础分;再做难的那道,哪怕只能通过部分测试用例,也能捞到部分分数。
这里要提醒的是:携程的笔试算分,据我了解选择题和编程题是分别计权的,编程题如果全A(通过全部测试用例)占比非常高。所以哪怕选择题错几个,只要编程题稳住,进面试的几率就很大。反过来,如果编程题两题都挂,选择题再高也悬。
2. 选择题核心考点复盘:不只是背八股
2.1 数据结构与算法:栈、队列、树的“送分题”与陷阱
携程的选择题里,数据结构部分占比不低,但难度整体介于校招常规水平和稍偏上之间。印象比较深的是一道关于“中缀表达式转后缀表达式”的题,它不直接问你转换结果,而是给出了一个用栈操作的中间状态,问当前栈内从栈底到栈顶的元素序列。看着简单,但如果不清楚“遇到右括号时要把左括号之上的运算符全部弹出”这个细节,很容易在某个中间状态上选错。
还有一个高频考点是二叉树遍历序列反推。它给出一棵二叉树的前序遍历和中序遍历,要求判断后序遍历的倒数第二个节点是什么。这种题没什么技巧,老老实实画图最稳。我当时是直接在草稿纸上把树画出来,再写出后序遍历序列,前后不到两分钟就解决了。千万不要心算,因为遍历序列反推树的题,只要中间某一步错,后面全错。
2.2 操作系统与计算机组成:虚拟内存、缓存命中、进程调度
操作系统这部分,携程考得比较“教科书”。有一道题问的是页面置换算法:在一个请求分页系统中,页面走向给定,分配3个物理块,问使用FIFO算法时的缺页次数。这个考点非常经典,但有个容易忽略的细节:如果题目说的是“开始时内存为空”,那么前三次加载页面都算缺页;如果题目改成“开始时已装入某些页面”,那情况就不一样。做题前一定要看清楚前缀条件,我考前刷题时就吃过这个亏,后来养成了“先看条件再看计算”的习惯。
还有一道关于缓存(Cache)的题,考的是直接映射方式下,主存地址如何划分成标记、行号、块内偏移。这题本质是考二进制换算。只要记住:Cache行数决定索引位位数,块大小决定偏移位位数,剩下的位都是标记,这题就能做出来。怕的是题目把Cache和内存大小都翻成十进制,让你绕个弯。
2.3 计算机网络:TCP与HTTP的实战化考察
网络部分,携程没有问太偏的协议细节,重点集中在TCP连接管理、HTTP状态码、DNS解析过程。有一道题问的是TCP建立连接的过程中,当客户端收到服务器的SYN+ACK报文后,如果客户端此时发送的ACK丢失,会发生什么。这个考的是TCP状态迁移的理解:服务器端会处于SYN_RCVD状态并超时重传SYN+ACK,客户端则进入ESTABLISHED状态开始正常发送数据(但数据报文里也带有ACK标志,能帮助服务器确认)。很多基础不扎实的考生会在“客户端无法发送数据”这个选项上纠结,其实TCP的设计恰恰允许数据捎带确认。
HTTP层面,携程考了一道关于GET和POST区别的题,问的不是常规的“哪个更快、哪个更安全”,而是“在什么情况下,POST请求体可能被浏览器缓存”。这其实是个偏冷的知识点,但结合了实际开发场景。我记得当时犹豫了很久,最后选择了一个相对合理的选项:浏览器一般不对POST请求体做缓存,除了一些特定场景(如某些代理服务器)会有例外。事后查资料,发现这道题可能没有绝对正确的答案,关键看你能否排除明显错误的选项。
这里给一个实用心得:携程的网络选择题,很少直接让你背“TCP三次握手第二步是什么”,而是倾向于给一个具体场景,问某个字段或状态的变化。所以复习时,不要把重点放在记忆协议细节,而是去理解每个机制“为什么要这样设计”。
2.4 Java与C++:语言特性对比题
技术通用岗的选择题里,Java和C++都会涉及,但不会让你写代码,主要是语言特性对比和“以下哪个说法错误”这类题。有一道题我记得很清楚:关于Java的HashMap在JDK 8中的变化,问“当链表长度超过8时,链表会转换成红黑树,此时数组长度最小是多少”。常规答案是“64”,因为链表转红黑树有两个条件:链表长度达到8,且数组长度不小于64。如果数组长度小于64,会先触发扩容而不是直接转树。这个细节,看过源码的都知道,只看过八股文的就容易忽略。
C++的题则偏向内存管理。有一道问的是“在C++中,下面哪种方式创建的对象存放在堆上”,选项有局部对象、静态对象、new出来的对象、临时对象。这个属于基础中的基础,但既然出现在携程的卷子里,说明他们确实希望通用岗候选人掌握底层内存区域划分的基本概念。
我自己的感受是:携程选择题的Java/C++部分不会故意刁难你,只要你大学课程没白上、平时写代码时留意过语言底层的设计思路,基本都能答个七七八八。但如果平时只是“面向搜索引擎编程”、从不看源码,这些题就会变成“好像选哪个都对”的玄学。
3. 编程题全解析:从读题到AC的全过程
3.1 第一题:字符串重排,简单但不白给
第一道编程题,题目的表述大致是这样的:
给定一个字符串,要求将其中的数字字符、字母字符、其他字符分别提取出来,按“数字-字母-其他”的顺序重新拼接,并且在每一类内部保持原有的相对顺序。若某类字符为空,则跳过该类。
这道题本质是三个队列的拼接,算法上没有任何难度,只要你会写基本的遍历和判断条件就行。但它的“坑”在于输入输出格式:
- 输入可能包含空格,所以不能直接用
cin >> s读取,要用getline。 - 字符串长度可能达到10^5级别,但题目没给额外空间限制,所以你可以放心地开三个StringBuilder,不需要原地操作。
我用Java写了一个很直观的版本,核心代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); StringBuilder digits = new StringBuilder(); StringBuilder letters = new StringBuilder(); StringBuilder others = new StringBuilder(); for (char c : s.toCharArray()) { if (Character.isDigit(c)) { digits.append(c); } else if (Character.isLetter(c)) { letters.append(c); } else { others.append(c); } } StringBuilder res = new StringBuilder(); res.append(digits); res.append(letters); res.append(others); System.out.println(res.toString()); } }这里有一个细节值得多说一句:Character.isLetter()判断的是Unicode字母,也就是说英文字母和中文都会归到字母类。如果题目本意是只保留ASCII字母,那就要改成(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')。我在考试时选了后者,因为题目里明确说了“字母字符”,按照一般编程题默认的ASCII范围来处理,更安全。
这道题还有一个隐藏考点:如果你用Python,直接''.join(filter(str.isdigit, s))也能一行搞定,但要注意str.isdigit在处理某些Unicode数字字符时会返回True,可能导致输出和预期不一致。所以即使Python很方便,也建议按字符ASCII范围手动判断,避免边缘case翻车。
3.2 第二题:图论问题,暴力只能过部分用例
第二道编程题就明显有区分度了。题干大意是:
给定一个有向图,每个节点有一个权值。现在定义一条路径的价值为路径上所有节点权值之和。求长度为k的路径(允许经过重复节点)的最大价值。路径长度定义为经过的边数,起点可以任意选择。
这个题第一眼看上去像是“树上最长路径”或“DAG上动态规划”,但“允许经过重复节点”这个条件让问题性质完全变了——你要是在一个正权环里绕圈,理论上路径可以无限长,价值也无限大;所以题目一定还有隐含限制,比如要求路径中不能有负权环、或者k不超过某个范围,或者权值有正有负。
我记得当时看到的输入约束是:节点数n不超过50,k不超过10^9。这个k的量级决定了纯DFS或BFS一定超时,必须用矩阵快速幂或其变种。
正规解法是这样的:把每个节点拆成“价值”和“转移”两个维度,构造一个(n+1) * (n+1)的矩阵,其中前n行n列存图的结构信息,最后一列用来累加权值。然后矩阵自乘k次,取最大值。这其实就是“带权路径最大值”的经典矩阵优化DP。
但如果现场一时半会儿想不起来矩阵快速幂怎么写,还有一个保底方案:用动态规划先求长度为1到k的路径最大值,转移方程是dp[i][v] = max(dp[i-1][u] + weight[v]),其中(u, v)是有向边。这个做法的复杂度是O(k * n^2),在k = 10^9时完全不现实,但如果测试用例里有一些k比较小的数据,你能通过20%-40%的用例,也能拿一部分分。
我当时选择的是写一个矩阵快速幂模板,但由于时间紧张,中间有一个状态转移矩阵的维度搞错了,导致样例通过但是提交后只过了60%的测试用例。考后复盘发现,问题出在初始矩阵的构造上:题目允许路径长度为0(即只选一个节点作为起点),但我的矩阵把长度为0的情况和长度为1的情况混在了一起,导致答案多算或者少算了一个节点的权值。
这里给出一个经验:如果你在笔试中遇到这种“知道思路但不确定细节”的题,建议先写一个暴力版本的DP做对拍,用小规模数据验证两个算法结果是否一致。赛码网支持在线调试,虽然不能像本地IDE那样打断点,但你可以先用样例测试,再自己构造一个n=3、k=5的简单例子,看矩阵快速幂和暴力DP的输出是否一样。一致后再提交,通过的把握就会大很多。
3.3 ACM模式下Java输入输出模板
赛码网和牛客网类似,编程题都是标准ACM模式:你需要自己解析标准输入,并把结果打印到标准输出。很多人第一次用特别不习惯,因为平时在LeetCode上只需要写核心函数,输入输出框架都是封好的。
这里分享一个我在赛码网笔试中验证过的Java模板:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = br.readLine()) != null) { if (line.isEmpty()) continue; String[] parts = line.split(" "); // 按题目要求处理输入 } } }用BufferedReader而不是Scanner,是因为赛码网的大数据量输入用Scanner会慢很多,可能间接导致超时。C++则建议用ios::sync_with_stdio(false); cin.tie(0);关掉同步,不然大数据量下容易TLE。Python的话,用sys.stdin的read()或readline()读输入,不要用input()一行行读,因为for循环里input()在大数据量下确实吃亏。
另外要注意的是:赛码网的Java环境是JDK 8还是JDK 11,不同批次可能不一样。如果你在代码里用了var或者String.repeat()这些新语法,在老版本JDK上会直接编译失败。保险起见,尽量使用JDK 8的语法写。
4. 笔试环境与意外情况处理
4.1 赛码网的在线考试流程
赛码网作为现在很多大厂校招笔试的平台,整体流程是:笔试开始前30分钟,你会收到一封包含考试链接的邮件/短信;点击链接后,进入一个等待页面,页面会显示考试倒计时、摄像头状态检查、屏幕录制授权等。建议至少提前20分钟进入,因为摄像头权限、浏览器弹窗、屏幕共享这些设置,在考前没调好,开考后再弄浪费的都是你自己的时间。
这里有一个非常实际的建议:尽量用Chrome或Edge浏览器,并把浏览器装在C盘默认路径下。赛码网部分考场功能插件对非默认路径的浏览器兼容性不太好,我之前用绿色版Chrome参加过一次模拟笔试,结果摄像头权限怎么都获取不到。后来换回官方安装版,一次性通过。另外,笔试过程中浏览器会强制全屏,且无法切出,如果误操作按了Alt+Tab,系统会记录一次“切屏警告”,多次警告可能被判作弊。我当时直接调成静音模式,桌面上只留IDE和浏览器两个窗口,物理上避免手滑切出去。
赛码网笔试一半支持本地IDE写代码再粘贴,也支持网页在线编辑器直接写。我的建议是:如果你对IDE不依赖,就在网页编辑器上直接写;如果日常写代码离不开本地IDE的自动补全,就把本地IDE开起来,写完把代码复制过去。但注意,本地IDE不要放在另一个屏幕上,否则容易被摄像头判定为存在“非考试设备”。
4.2 断网与断电的应急预案
线上笔试最怕的就是断网。赛码网对断网有一定容忍度,一般断网30秒内重连,考试仍可继续;断网超过一定时间,系统会自动提交当前进度。问题是,你断网期间可能正在编辑代码,如果没点“保存到草稿箱”,恢复网络后代码可能丢。所以我的建议是:写编程题时,每隔几分钟就把代码复制到本地记事本或者Word里备份一下。虽然麻烦,但万一断网,起码代码还在。
如果你的网络环境不稳定,可以在考前用手机热点作为备用网络。一旦Wi-Fi断了,立刻切热点,再把网络切回去。提前把手机放在手边,不要放到另一个房间。这些看似琐碎的细节,关键时刻能救你一命。
4.3 摄像头监控与答题规范
2023年这届秋招,很多大厂的线上笔试都有AI监考功能:摄像头实时检测你是否在看向屏幕、面部是否被遮挡、是否有多人出现在镜头范围内。赛码网也不例外。我在笔试过程中不小心低头捡了一支笔,系统就弹出了一个“面部检测中断”的提示,吓得我赶紧坐直。虽然最后没有被判违规,但那一瞬间的紧张情绪会打断做题节奏。
关于摄像头,有几个注意事项:
- 不要戴帽子、口罩、墨镜,五官要被清楚识别。
- 眼部不要贴得太近屏幕,视线尽量保持在屏幕中间区域,频繁看手机或看向屏幕外会被标记异常。
- 房间内尽量只留你一个人。如果有家人走动,提前打好招呼。
如果你担心这些规则,可以在正式笔试前,去赛码网做一次模拟笔试。大部分企业会开放“模拟测试”环节,专门让你熟悉这套监考流程。千万别跳过这一步,我就是靠着模拟笔试提前确认了摄像头、麦克风、网络都OK,正式笔试时心态才没崩。
5. 常见问题与避坑指南
5.1 笔试中的经典时间陷阱
除了前面提到的“先跳过难题”外,还有一个很隐蔽的时间陷阱:编程题编译运行等待时间。赛码网每提交一次代码,需要排队编译、运行、比对输出,高峰期可能要等20-30秒甚至更久。如果你的代码在编译阶段就报错,这一来一回可能就耗掉2-3分钟。所以,写编程题时一定要先在本地IDE或网页编辑器的“自测”功能里跑通样例,确认无误后再点提交。不要拿提交来试错——这是联考笔试里最浪费时间的操作。
另外一个建议:把编程题代码写完并测试通过后,不要急着提交,再仔细读一遍题目,确认输出格式是不是“每个结果占一行”、有没有要求浮点数保留几位小数、空行要不要保留。很多题目样例通过但提交后0分,就是因为输出多了一个末尾空格或换行。
5.2 题目做不完怎么办:策略性放弃与蒙题技巧
携程这套笔试题量,在90分钟内全部做完并且保证准确率,还是有一定难度的。如果确实时间来不及,我的建议是:
- 选择题:先排除掉明显错误的选项,再从剩余选项里选那个“最像是基础课里讲过”的。大厂的通用岗笔试,选择题通常不会出偏题怪题,往往是“基础概念+一个陷阱”,所以你觉得熟悉但又有微妙区别的选项,通常是正确答案。
- 编程题:如果第二道题实在没思路,就写一个最暴力的解法(比如直接枚举所有路径),哪怕只过20%的测试用例,也比交白卷强。赛码网的判分机制一般是按通过的测试用例比例给分,所以“部分正确”照样有分。
我认识的一位一起参加笔试的朋友,第二道编程题只写了暴力DFS,通过率大约30%,最后还是进了面试。这说明编程题拿到部分分并不丢人,比“编译失败0分”强太多了。
5.3 复盘笔试结果的黄金时机
笔试结束后,大多数人会立刻把题目忘掉。但如果你想在后续的面试中占得先机,我强烈推荐在笔试结束后40分钟内做一次“回忆式复盘”:
- 把选择题里不确定的题目关键词记下来,考后立刻查资料,弄懂正确思路。这类知识点很可能在面试的“基础知识问答”环节再次出现。
- 把编程题的题目描述、输入输出样例、你的解法思路记在笔记里。携程的一面,面试官偶尔会问“笔试第二题你是怎么做的”,如果你能清楚地说出当时的思路、以及复盘后发现的更优解法,会给面试官留下很深的印象。
我当时就是因为复盘了那道“矩阵快速幂求最长路径”的题目,在面试时主动和面试官聊起了图论中“路径价值最优化”问题的一般解法,面试官明显兴趣大增,追问了几个相关场景。这段经历成了整场面试的加分点。
5.4 性格测试与综合测评要不要认真做
2023年携程的秋招流程里,部分岗位在笔试之前或之后还会附带一个性格测评/职业价值观测评。虽然它不计入笔试总分,但会作为“是否匹配团队文化”的参考。我个人建议是:尽量按照自己的真实情况作答,不要刻意去迎合所谓的“理想候选人画像”。因为性格测评题里往往埋了很多重复题和反向题,如果你前后答案矛盾太多,系统会标记为“诚信问题”,反而弄巧成拙。
另外一个注意点:性格测评通常单独通知、单独计时,不要和正式笔试混在一起,别以为笔试做完就万事大吉,漏做了测评同样会导致流程终止。
6. 一个过来人的复盘建议
笔试题量大、时间紧、平台卡顿、题目超纲、选择题不确定性高、编程题部分通过拿不到满分……这些都是2023年乃至往年秋招笔试的常态,2023年不会更好,但也不会更差。我见过太多人因为笔试里一两道题没做出来而心态崩了,直接放弃后续面试。但其实,笔试说白了只是一道筛选门槛,只要你能超过“同批次候选人的中位数”,就有机会进入下一轮。
从携程这家公司本身来说,技术通用岗考察的知识点非常“科班”:数据结构、操作系统、网络、语言基础、算法编码。这意味着,它不像某些公司那样会考大量“脑筋急转弯”式智力题或偏门冷知识,只要你大学课程学得扎实、刷过一定量的LeetCode中等难度题,通过笔试的概率就很大。
如果你正在准备下一场类似的秋招笔试,我最后的建议是:提前一天把赛码网的调试流程玩熟,考前30分钟检查网络和摄像头,考试时先保住选择题的正确率、再拼编程题的通过率,遇到做不出的题果断跳过,最后留5分钟检查一遍有没有漏题。做到这几点,你就可以把更多精力留给后面的面试了。
说到底,笔试只是秋招路上的一道关卡,既不是起点,也不是终点。把它当成一次高质量的自测,考完无论感觉好坏,认真复盘,带着收获往前赶,比纠结一城一池的得失重要得多。
