ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

携程技术岗秋招笔试复盘:题型拆解与赛码网避坑经验

携程技术岗秋招笔试复盘:题型拆解与赛码网避坑经验 2023年的秋招整体感受就一个字卷。投了携程的技术通用岗简历过筛后收到笔试通知排在第一批发卷批次线上笔试平台走的是赛码网。整场笔试120分钟20道选择题外加3道编程题题量不算夸张但覆盖面确实广从计算机基础到算法思维都有涉及。这篇就把这次笔试的完整复盘写出来从题型拆解到具体题目的解题思路再到赛码网环境下的避坑经验一次说清楚。这篇文章适合两类人看一类是准备投携程或者其他大厂技术岗的秋招候选人另一类是笔试经验不多、想提前了解在线笔试平台玩法的人。不管你是哪类看完应该都能少踩几个坑。1. 笔试全貌与整体复盘1.1 技术通用岗考什么先说下技术通用岗这个岗位的定位。它不像后端开发、前端开发那样有明确的技术栈边界更像是一个面向综合技术能力的岗位所以笔试不会死磕某个方向的深水区而是把计算机基础、编程能力、逻辑思维全都覆盖到。实际做下来我的感受是选择题考的是知识面编程题考的是基本功。这次笔试的时间安排是120分钟20道选择题加3道编程题。选择题有单选也有多选范围涵盖计算机网络、操作系统、数据库、Java/C基础、数据结构这些计算机核心课程的内容。编程题则是标准的ACM风格需要自己处理输入输出用你熟悉的编程语言完成算法实现。跟前几年的题目对比一下就会发现携程的笔试风格一直比较克制不搞偏题怪题但会在看似常规的题目里埋一些容易忽略的细节。比如某道关于HTTP状态码的选择题选项里把301和302的语义做了微调粗心的话很容易掉坑。1.2 时间预算与做题节奏我在做题前先扫了一遍所有题目做了个简单的预算选择题给60分钟每道题平均3分钟编程题给60分钟每道题20分钟。这个分配在实操中基本成立不过最后一道编程题我花了接近30分钟压缩了检查选择题的时间。这里有个建议选择题里遇到拿不准的先标记跳过不要恋战。3分钟做不出来的题目往往是你知识盲区再花5分钟也还是不会。我身边有同学就是在选择题上死磕一道题结果后面编程题没时间写完这是最亏的。1.3 难度评估与考察逻辑整体难度我给6.5分满分10分的话。选择题里大概有7-8道是送分题只要上课认真听过就能答对5-6道是中等题需要理解原理而不是死记硬背剩下的属于拉分题区分度比较高。编程题第一题简单第二题中等偏上第三题确实有难度估计是用来卡一批人的。从考察逻辑来看携程比较看重候选人的工程基础和应用能力。编程题不会考那种非常偏门的算法更多是高频实用的算法模型比如动态规划、贪心、字符串处理这些在实际业务开发中经常用到。想明白这一点你就知道复习的重点应该放在哪里了。2. 选择题部分基础不牢地动山摇2.1 计算机网络与操作系统高频考点选择题里网络和操作系统加起来占了差不多一半的分量这是技术岗笔试的老传统了。这次涉及的考点包括TCP三次握手、HTTP状态码语义、DNS解析流程、进程与线程的区别、死锁产生的四个必要条件、虚拟内存与页面置换算法。印象比较深的是有一道关于TCP拥塞控制的题问的是慢启动阶段拥塞窗口的增长方式。这个知识点如果你只是背概念很容易在指数增长和线性增长之间搞混。实际上慢启动阶段是指数增长达到慢启动阈值后进入拥塞避免阶段才变成线性增长。这类题考的是对过程的理解不是简单的名词记忆。操作系统那边有一道关于死锁的题给了一个资源分配图问当前系统是否处于死锁状态。这种题我建议你复习的时候把银行家算法好好看一下因为题目不会直接问你死锁条件而是给一个实际场景让你判断。我做的这道题系统其实还没有死锁因为还存在着一个安全序列但如果某个进程再申请一个资源就会触发死锁。平时多练这类分析题考场上才能快速反应。2.2 数据库与编程语言基础题避坑数据库大概考了三四道题集中在索引、事务隔离级别、SQL查询优化这些点上。有一道题问的是InnoDB引擎下主键索引和二级索引的结构区别其实就是聚簇索引和非聚簇索引的对比。这个知识点看起来简单但如果你只知道主键索引的叶子节点存整行数据这个结论而不清楚为什么这么设计遇到变种题就容易懵。编程语言方面Java和C都会涉及。Java部分考了HashMap在JDK 7和JDK 8之间的区别尤其是引入红黑树后的变化。C部分考了指针和引用的区别、虚函数的作用、智能指针的使用场景。我建议同时熟悉两种语言的基础语法因为题目不会标注是Java题还是C题而是混合出现。这里有一个踩过的坑涉及到多选。有一道关于Java垃圾回收的题选项里提到了System.gc()一定会触发Full GC这个说法这个一看就是错的但如果你对GC机制了解得不够细致可能就会被带偏。实际上System.gc()只是建议JVM执行垃圾回收具体是否执行以及如何执行取决于垃圾收集器的实现。2.3 值得反复看的经典错题考完之后我跟几个朋友对了一道题发现大家都错了就是关于HTTP状态码301和302的区别。301是永久重定向302是临时重定向这本身不难。但题目问的是一个具体场景用户访问一个已经迁移到新地址的页面搜索引擎应该收到哪个状态码。正确是301因为资源已经永久迁移搜索引擎需要更新索引如果返回302搜索引擎会继续抓取旧地址导致新页面迟迟得不到收录。这个场景化出题思路比干巴巴地背状态码含义要高级得多。另外一道印象深刻的题是从输入URL到页面显示这个过程中间经历了哪些步骤。这个题属于综合性问题涉及DNS解析、TCP连接、HTTP请求、服务器处理、浏览器渲染等多个环节。选项里把几个步骤打乱让你选出正确的顺序。这类题考察的是你对整个链路的理解而不是单独某个环节。建议复习的时候画一张数据流向图把每一步的关系理清楚做题会轻松很多。3. 算法编程题赛码网上的实战对线3.1 三道题的分布逻辑编程题一共三道难度递进整体符合大厂笔试的常规设计。第一道题是纯字符串处理考察基础编码能力第二道题是个贪心或者二分的问题考察算法思维第三道题是动态规划难度最大我隐约觉得出题人想结合携程的业务场景来做题面包装。实际做题的时候我先把三道题都读了一遍然后从第一道开始做。第一题写得比较顺大概10分钟就搞定了。第二题卡了一会儿最后用贪心加排序写出来了。第三题看了五分钟没找到状态转移方程先回头检查了一遍前面的选择题再回来继续想最后在剩15分钟的时候把思路理清了写出了代码。这里有个经验如果时间紧张先保证前两道题完全正确再攻第三道性价比最高。3.2 字符串处理看似简单实则杀手第一道编程题我记得是类似字符串压缩的题目。给你一个字符串把连续出现的字符压缩成字符出现次数的形式如果压缩后的字符串长度没有变短就返回原字符串。这个题看起来简单实际上有几个细节需要注意。我用了双指针加StringBuilder来做整体思路是遍历字符串用一个指针记录当前字符连续出现的起始位置另一个指针向后扫描直到字符变化然后计算这段子串的长度拼接结果。代码本身不难但有一个边界情况很容易漏掉字符串最后一个字符的处理。如果最后一段连续子串在循环结束时没有拼接结果就会少一块。我当时专门处理了循环结束后的收尾逻辑。public String compressString(String S) { if (S null || S.length() 0) return S; StringBuilder sb new StringBuilder(); int i 0; while (i S.length()) { int j i; while (j S.length() S.charAt(j) S.charAt(i)) { j; } sb.append(S.charAt(i)); sb.append(j - i); i j; } String compressed sb.toString(); return compressed.length() S.length() ? compressed : S; }这个版本的代码有一个小优化点在拼接次数的时候我直接用了j - i而不是在内部循环里用计数器累加这样少了几次加法运算逻辑也更清晰。在赛码网上提交的时候我先把这段代码完整读了一遍确认没有多余的空格和缺少分号因为这类平台对编译错误非常敏感一个低级编译错误可能直接导致整题0分。还有一个容易踩的坑是输入处理。赛码网不像LeetCode那样直接给你一个函数签名而是需要你从标准输入读取数据。我当时用的是Scanner读取一行字符串然后调用处理函数最后输出结果。如果你平时习惯了LeetCode的做题方式第一次用赛码网很容易在输入输出上卡壳建议提前熟悉一下Scanner和System.out的用法。3.3 动态规划与贪心识别套路是关键第二道题我记得跟区间调度有关类比的场景是给定一系列订单每个订单有开始时间和结束时间问最多能接多少单。这个其实就是经典的活动安排问题贪心策略是每次都选结束时间最早的订单。贪心算法的核心是证明贪心策略的正确性。对于区间调度问题为什么选结束时间最早的就能得到最优解因为结束时间越早剩余的可利用时间就越多后续可安排的订单也就越多。这个逻辑听起来简单但如果你不知道这个套路可能会尝试用动态规划或者深搜去做虽然也能做出来但复杂度高、代码长还容易超时。我当时用的实现思路是先把所有区间按结束时间排序然后遍历一遍维护一个当前已选订单的最后结束时间。每当遇到一个开始时间不小于这个结束时间的订单就选它并更新结束时间。时间复杂度是O(nlogn)排序占大头。第三道题是动态规划我花了最多时间。题面包装成一个旅游场景给定一系列景点每个景点有游玩时间和评分你的假期总时间是固定的求评分总和最大的游玩方案。这其实就是01背包问题。背包容量是假期总时间物品重量是景点游玩时间物品价值是景点评分。状态转移方程是dp[j] max(dp[j], dp[j - time[i]] score[i])其中dp[j]表示在j时间内能获得的最大评分。实现的时候要注意dp数组初始化为0然后遍历每个景点对于每个景点再倒序遍历背包容量保证每个景点只能被选择一次。如果正序遍历同一个景点会被选择多次那就变成了完全背包问题这是经典的细节陷阱。int n sc.nextInt(); int totalTime sc.nextInt(); int[] times new int[n]; int[] scores new int[n]; for (int i 0; i n; i) { times[i] sc.nextInt(); scores[i] sc.nextInt(); } int[] dp new int[totalTime 1]; for (int i 0; i n; i) { for (int j totalTime; j times[i]; j--) { dp[j] Math.max(dp[j], dp[j - times[i]] scores[i]); } } System.out.println(dp[totalTime]);3.4 考场上的代码习惯在赛码网上写代码有几个习惯我觉得挺重要。第一变量命名要清晰虽然判题系统不会检查你的代码风格但如果中间出错需要调试良好的命名能帮你更快定位问题。第二写注释。笔试的判题系统不会看注释但我自己在写关键逻辑的时候会顺手写一行注释这样回头检查代码的时候能快速回忆起当时的思路节省重新理解代码的时间。这个习惯在时间紧迫的笔试里非常实用。还有一点提交之前一定要自己做一些边界测试。我当时在第一道题的程序里测试了空字符串、单字符字符串、全相同字符字符串这三种特殊输入确保没有越界或者逻辑漏洞。测试输入的时候赛码网允许你自定义输入数据不要浪费这个功能多试几组边界情况比盲目提交更稳妥。4. 常见问题与排查技巧实录4.1 赛码网笔试环境的坑赛码网是国内常见的在线笔试平台携程、微众银行、绿盟科技等公司都在用。第一次用这个平台的话有几个坑提前知道比较好。第一输入输出的处理方式和LeetCode完全不同。LeetCode给你一个函数接口你只需要实现函数体赛码网需要自己处理标准输入输出也就是说你必须从System.in读取数据把结果用System.out打印出来。这个差异如果你不提前练习考试时很容易花很多时间在调试输入输出上。第二赛码网在线编辑器不会像IDE那样帮你检测语法错误代码写完了必须手动检查。我提交第二道题的时候第一次因为少写了一个分号编译失败白白浪费了宝贵的提交机会。所以提交之前一定要逐行检查语法尤其注意括号是否匹配、分号是否齐全、import语句是否完整。第三赛码网对浏览器的兼容性有一定要求建议提前用Chrome或者Edge并且保证网络稳定。我考试那会儿旁边有个同学中途网络波动断线了折腾了好几分钟才重新连上节奏全乱了。如果是远程笔试提前检查好网络和电脑状态真的很重要。4.2 时间分配与做题顺序策略我见过很多人在笔试环节翻车不是因为不会做题而是因为时间分配不合理。这里分享一个我个人觉得比较稳妥的策略拿到卷子先用3-5分钟快速浏览所有题目判断题目的难度分布形成一个大概的时间方案。选择题建议按顺序做跳过不确定的题目。我给自己定了规则一道选择题如果超过3分钟还没有头绪就在题号上标记一下等做完其他题再回来。编程题先做最简单的确保拿满基础分再啃硬骨头。我第二道题卡住的时候果断先去看了第一道题等把第一题AC了心情稳定下来再回头想第二题思路反而打开了。遇到不会做的题不要慌深呼吸换换脑子有时候答案就在放松的瞬间跳出来。4.3 编程题超时的应急预案如果编程题写到一半发现时间不够我的建议是写出核心逻辑的伪代码然后在上方用注释说明你的思路。虽然这不会带来AC分数但如果这道题有人工复核环节至少能让面试官看到你的解题思路比一片空白要好。另外如果你用的是Java赛码网一般默认提交的是Main类你需要把主类名改成Main才能编译通过。这是一个非常经典的失误点我朋友就栽在这里过写代码的时候类名叫Solution提交后一直编译错误找了半天才发现是类名不对。4.4 笔试经验速查表考察方向高频考点准备建议计算机网络TCP/UDP、HTTP状态码、DNS结合场景理解协议设计逻辑操作系统进程调度、死锁、虚拟内存画图理解状态流转做资源分配类题目数据库索引结构、事务隔离级别、SQL优化搞懂B树底层原理多练手写SQLJava基础HashMap、GC、集合类线程安全看源码理解设计思路C基础指针引用、虚函数、智能指针对比Java的差异来记忆数据结构栈、队列、树、图刷LeetCode高频题掌握模板解法算法动态规划、贪心、滑动窗口归纳题型背熟经典题模板笔试结束之后适当的复盘比准备下一场更有意义。我把每道错题对应的知识点整理成了一个文档尤其是那些我以为会但实际做错的题目对照着查漏补缺。后来再参加其他公司的笔试明显感觉基础知识这块扎实了很多。赛码网上的笔试经验我算是用一次实战换来的。说实话第一道编程题明明很简单但因为紧张我第一遍写的时候漏掉了一种情况测试用例没过。当时心里咯噔一下赶紧深吸一口气重新读了一遍题目要求才发现问题出在压缩后字符串长度没有变短时需要返回原字符串这个条件上。考场上的紧张感真的会让人犯一些低级错误平时练习的时候还是要多模拟真实的笔试环境和节奏。最后再分享一个小技巧笔试前把快捷键背熟。赛码网编辑器里CtrlS提交、CtrlZ撤销、CtrlShiftZ重做这些操作在紧张的时候能帮你节省大量时间。用鼠标点来点去在高强度的笔试里真的很浪费。祝大家笔试顺利都能拿到心仪的面试通知。
返回列表