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

资讯详情

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

携程研发秋招笔试攻略:题型解析、算法重点与时间分配

携程研发秋招笔试攻略:题型解析、算法重点与时间分配 春招季我又把自己以前存的一堆笔试记录翻了出来刚好有朋友在问携程研发方向秋招笔试怎么准备我想干脆把当时整理的思路和踩过的坑完整写下来。2019届秋招那会儿携程的研发岗笔试刷人比例不低不是学历就能扛过去的算法、基础、工程思维都要在线。这篇文章不打算给你一份“标准答案”而是想聊清楚一件事面对携程这种互联网公司的研发笔试你真正要训练的是什么以及如何在有限时间内把得分效率最大化。先说个整体感受携程研发笔试的风格偏向“基础扎实型”没有太多偏题怪题但覆盖面挺广。算法题集中在排序、贪心、动态规划、图论基础非算法部分会考察操作系统、计算机网络、数据库和一门主流编程语言。如果你平时刷题量不大数据结构基础一般那笔试成绩很容易被拉在及格线边缘。反过来如果你能把高频考点吃透笔试反而是拉开差距的地方。这篇文章会按我的复盘顺序展开从准备、题型、时间分配、代码实现、复盘延伸一路讲尽量还原我当时完整的思考和操作过程。1. 研发方向笔试到底在考什么不只是“刷题能力”1.1 岗位要求拆解技术栈、项目经历、基础知识准备笔试之前最好先把目标岗位JD拆一遍。携程研发方向的岗位一般分成后端、客户端、数据、算法、前端等方向虽然都叫“研发”但笔试侧重点有明显差异。我当时投的是后端研发所以笔试里Java/C相关题目占了不小比例数据库、操作系统、网络的知识点也会出现。以2019届秋招的后端研发为例笔试大致有两个阶段第一部分是客观题包括不定项选择、判断题考察的是计算机基础第二部分是编程题2到3道不等需要在线编译提交。这里有个容易忽略的点题目不会特别标注“这是后端题还是前端题”但客观题里会隐含着岗位倾向。比如后端岗位的卷子里数据库和Linux的题目出现频率明显更高。另外项目经历虽然在线下笔试里不会被直接看到但它决定了你的简历能不能过初筛。携程这类公司的简历筛选速度比较快如果你简历上有和旅游业务相关的项目比如票务系统、订单管理、高并发接口设计会更容易让面试官产生兴趣。不要以为笔试只靠算法项目经历是让你“有资格参加笔试”的前提。1.2 笔试在整条招聘链路中的定位很多人对笔试的认知存在两个极端有人觉得笔试只是走个过场后面面试才重要也有人把笔试当成决定生死的关卡一旦没考好就觉得没希望了。真实情况是笔试成绩既不会单独决定你是否拿offer也不会完全不影响后续面试。携程的招聘流程一般是网申、在线笔试、技术面试、HR面试、意向沟通。笔试的主要作用是“筛选”把技术基础明显薄弱、代码能力不过关的候选人先过滤掉。到了面试环节面试官手里会有你的笔试成绩和代码提交记录如果笔试成绩不错面试时基础题考察会适当减少如果笔试成绩一般面试官可能会多问一些基础问题来确认你的真实水平。所以笔试真正要解决的只有一个问题让面试官相信你具备基本的工程能力。不需要你考满分也不需要所有压轴题都能AC但客观题正确率不能太低至少有一道编程题能拿到全部或大部分分数。这个定位决定了复习策略重心永远在基础和中等难度题不要死磕极少数超纲题。1.3 我眼中的目标群体与考察主线如果你是计算机科班出身平时课程里学过数据结构、操作系统、计算机网络、数据库那么笔试的主线就是“把课堂知识转化为考场上能快速调用的能力”。如果你是非科班或者转专业那么笔试的挑战会更大一些因为你不仅要补知识点还要补“题感”。考察主线可以概括成一句话“用代码解决问题的能力。”客观题是对知识面的扫描编程题则要求你在限定时间内独立完成问题拆解、算法选择和实现。我印象很深的一点是携程的编程题不追求特别复杂的算法但很看重边界条件的处理。举个简单的例子如果输入是一棵树的节点数N后面的N-1行表示边你是用递归还是非递归遍历如果N特别大递归会不会爆栈这样的考察点在平时刷题时很容易被忽略但笔试里很常见。所以不要只盯着题解看要多想一想“为什么这道题要这么设计边界”这种思维习惯比多刷二十道题更有价值。2. 笔试启动阶段把复习范围收敛到“高频考点”2.1 官方信息源与往年真题的价值我当时准备的第一件事不是打开题库狂刷而是把携程校招官网、招聘公众号、牛客网上的讨论帖都翻了一遍。目的只有一个搞清楚笔试题型和大致范围。这里面有一个比较实用的方法在牛客网、CSDN上搜索“携程笔试 2019”或“携程研发 笔经”你可以找到往届考生回忆的题目和考点。虽然回忆版不一定完全准确但足够反映题型风格和难度分布。比如我当时看到的经验帖里普遍提到客观题重点在Java基础、数据库索引、TCP/IP、Linux常用命令编程题则偏重字符串处理、数组操作和动态规划。基于这些信息我很快把复习范围从“所有计算机基础知识”收敛到了一个可执行的清单。另外携程笔试使用的在线考试系统也值得提前了解一下。不同的考试系统在代码编辑、输入输出处理、提交反馈上会有差异。有的系统允许你本地编译后粘贴代码有的则必须在网页里直接编辑。提前在牛客网或赛码网熟悉在线编程环境可以避免考试时因为不熟悉编辑器而手忙脚乱。2.2 应该掌握的算法清单与易漏考点算法准备不能漫无目的我整理了一个适合携程研发方向笔试的算法优先级清单排序快速排序、归并排序的原理和手写实现尤其是时间复杂度分析。二分查找常见变形比如查找第一个大于等于目标值的位置、旋转数组中的最小值。链表操作反转链表、合并有序链表、找中间节点、判断是否有环。二叉树前中后序遍历、层序遍历、最近公共祖先、二叉树直径。贪心算法区间调度、跳跃游戏、分发饼干这类经典题。动态规划背包问题、最长递增子序列、最长公共子序列、编辑距离。图论基础图的遍历、拓扑排序、最短路径Dijkstra、Floyd。字符串处理KMP、字符串匹配、正则表达式匹配这个较难但值得了解。容易漏掉的考点反而是“基础知识类”里穿插的算法题。比如有些选择题会让你计算某种排序算法在特定输入下的比较次数或交换次数如果你只是会用API而不理解内部过程就会卡壳。2.3 编程语言选型与代码模板的重要性笔试编程题支持的语言一般有C/C、Java、Python。选型要遵循两个原则一是你平时最常用、最不容易出语法错误二是对输入输出处理要足够熟悉。我当时用的是Java因为后面的面试也大概率会问Java用笔试题顺带复习Java API很划算。但如果你对C的STL更熟或者用Python刷题更快也完全可以。核心是不要在考试时问自己“这个函数是来自哪个包”这种问题必须在考前就解决掉。还有一个容易被忽视的点提前准备好常用的代码模板。比如二叉树的前中后序遍历模板、快速幂模板、并查集模板、Dijkstra模板不要等到考场上现场推导。这些模板不用背得一模一样但要理解内部逻辑能根据题目要求快速改。我当时把常用模板整理在本地文档里考前一周每天手写一遍尤其是并查集和Dijkstra因为这些题一旦考到现场推容易出错但有模板直接改就很稳。3. 研发方向笔试的题型结构与时间分配3.1 单选/多选/编程题占比为什么读题顺序很关键以2019届秋招研发方向笔试为例题目结构大致是单选10-20道、多选5-10道、编程题2-3道。总时长通常在90分钟到120分钟之间。这个时间看起来不少但如果你在客观题上耗时太多编程题的时间就会被压缩反之亦然。我的建议是拿到试卷后先快速浏览一遍所有题目。重点看编程题的难度和自己的把握程度。每道编程题至少预留30分钟如果你只有90分钟总时长那客观题必须控制在40分钟以内。这需要你在读题时快速判断哪道编程题是送分题哪道是中等题哪道可能是压轴题。不要按顺序硬着头皮做先做最有把握的。一个常见的失误是看到第一道编程题觉得很简单就手写代码写得很细致结果花了40分钟后面两道题只剩20分钟草草提交得分很低。正确做法是第一道送分题也保持“快写快测”不要过度投入。比如字符串反转、数组去重这类题十行以内就能解决不要为了“优美代码”去折腾花里胡哨的写法。3.2 编程题常见的四类场景从大量笔试经验帖来看携程研发方向笔试的编程题大致可以归为以下四类场景第一类字符串处理题。这类题考察基本功常见操作包括反转字符串、统计字符频率、判断回文、去除空格、根据规则拆分字符串等。看起来简单但边界条件很丰富。比如输入可能包含空字符串、只有空格的字符串、长度超大的字符串这些都要提前想清楚。第二类数组与模拟题。常见形式是给你一个数组你需要按某种规则进行变换比如移动零、合并区间、求连续子数组最大和。这类题经常和排序、双指针、前缀和结合在一起。考场上最容易翻车的地方是对“原地操作”的理解因为在线评测系统会严格检查空间复杂度超不超限。第三类经典算法题。一般指向排序、二分、贪心、动态规划和简单图论。比如给定一些城市和飞机票价求最便宜的中转路线这类题就对应最短路径算法。携程作为在线旅游平台很喜欢出与“行程”“订单”“城市”相关的算法题本质上是用业务场景包装经典算法。第四类并发或系统设计题较少见但偶尔出现。这种题不会让你真的写一个完整系统但可能会问你某个场景用哪种数据结构或缓存策略。比如“设计一个订单号的生成器”或“如何统计某个时间窗口内的热点景区”这类题需要你对基础组件有一定了解。3.3 时间分配策略如何避免“会但做不完”我总结了一套比较实用的时间分配方法适用于绝大多数在线笔试前5分钟浏览整张试卷。把客观题中一眼能确定答案的题先勾出来把编程题的难度估个级。客观题阶段大约30-40分钟先做单选再做多选。遇到不会的题目不要恋战先标记最后再回来蒙。注意不定项选择的评分规则有的多选少选得一半分选错则零分这时候“保守决策”可能比“完美决策”分数更高。编程题阶段大约60分钟先做最有把握的那道把那道题拿满再做中等难度题最后如果还有时间再碰压轴题。每道题都要预留至少10分钟来调试和检查边界。这里有一个细节在线笔试系统通常会给出“样例输入输出”但样例通过不代表你的代码能拿到全部分数。你需要额外手造几组测试数据来验证边界。比如输入为空、输入为最大值、输入重复元素、输入只有一个元素等。我当时在笔试时吃过亏一道字符串题样例全过但实际只拿了部分分就是因为没考虑空输入的情况。关于“做不完”这件事我的看法是你不需要所有人都做完所有题只需要在时间线上优先处理性价比最高的题目。很多时候压轴题的前半部分也是可以得分的比如动态规划题先写一个暴力递归也能拿部分测试点的分比什么都不写强得多。4. 算法题解题实战从暴力解到最优解的临场思路4.1 第一题签到题但必须稳拿以我当时遇到的题目为例第一道编程题是比较简单的数组处理题基本上属于“签到题”。签到题的目的不是区分度而是让你稳住心态。这类题通常是把题目描述翻译成代码没有复杂的算法陷阱。但“简单题”也有翻车的方式。一个是读题不仔细。比如题目要求输出用逗号分隔你用了空格题目说要去重后按升序输出你只做了去重但没排序。在线评测系统对输出格式的检查是严格匹配的一旦格式不对哪怕逻辑正确也会判错。所以我建议每道题的输入输出描述都逐字读一遍特别是“升序”“降序”“字典序”“要求稳定”这类词。另一个是效率问题。有些签到题会故意把数据范围设计得很大比如N10^5这时候O(N^2)的算法会超时。你不能因为题目简单就忽略复杂度。看到题先看数据范围如果N很大优先考虑O(N)或O(NlogN)的方案。这道题本身并不难但如果你用了嵌套循环就会在性能测试点挂掉。4.2 第二题贪心/动态规划类题目的突破口第二题往往就是分水岭。如果你能顺利做出这道题笔试成绩基本就不错了。这类题经常包装成“旅行规划”或“订单分配”的形式比如“给定一组航班价格求恰好转机K次的最小花费”或“在时间区间内选择最多的景点”本质上就是经典的“加油问题”“股票买卖”“最长上升序列”等等。我拿到这类题第一步不是想算法而是先确认输入规模判断该用动态规划还是贪心。如果发现可以用贪心我会尝试用反例来验证“贪心是否成立”。很多时候笔试里看起来像贪心的题其实需要动态规划。一旦用错思路代码写了一半才发现问题会浪费大量时间。如果是动态规划题就按照“定义状态、推导状态转移方程、确定边界条件、优化空间复杂度”四步来走。举个例子如果考“最小编辑距离”状态定义就是dp[i][j]表示A前i个字符编辑到B前j个字符的最小次数转移方程则分相等和不相等两种情况。边界条件就是dp[0][j]j和dp[i][0]i。这类题一旦状态定义对了代码就可以按模板写出来。做题时如果快速推导不出最优解可以先写一个暴力解法。在线评测系统往往是“部分数据点给分”哪怕你是O(2^N)的复杂度只要处理小数据没问题也能拿到一部分分数。这比交一个“编译失败”或“只过了样例”的代码要强很多。4.3 第三题图论或复杂模拟题怎么取舍第三题一般是压轴题难度和计算量都比较大。2019届那场笔试压轴题和我前面提到的“航班中转最便宜路线”版本很像实际上就是Dijkstra的变形。这类题通常不是让你默写模板而是要求你在经典算法上做修改比如增加“经过的边数不能超过K”这个限制此时就要考虑Bellman-Ford或用带层数的BFS。我当时的取舍策略是先花5分钟读懂题然后快速判断是否有平时练过的相似题。如果有就从相似题的思路开始写如果没有不要抱着“非AC不可”的心态把能想到的暴力解写出来争取部分分。压轴题的设计初衷就是为了筛出代码能力很强的人拿不到全分不代表笔试没戏。如果是复杂模拟题比如实现一个简单的订票系统重点反而是“逻辑清晰”而不是算法难度。这类题很容易出现“边界漏判”或“变量状态错乱”的问题。建议先在草稿纸上列出状态机和关键流程再动手写代码。不要把复杂逻辑全部塞在脑子里否则写到一半很容易乱。5. 非算法考点操作系统、网络、数据库和编程语言基础5.1 这些考点出现的背后逻辑有些同学觉得笔试题里为什么还要考操作系统和数据库明明岗位工作以后几乎都在写业务代码。但招聘方不这么想。笔试考基础是因为校园招聘的候选人很难有丰富的项目经验面试官需要通过基础知识判断你是不是具备“计算机科班”的思维方式。如果你连进程和线程的区别、TCP握手的过程、数据库索引的数据结构都说不清楚后续工作中遇到性能问题很容易抓瞎。携程作为在线旅游平台它对稳定性和并发的要求比较高。你在旅途中查航班、订酒店背后是海量用户在同时访问。这就要求后端工程师理解并发、缓存、数据库连接池、消息队列等概念。笔试里考这些本质上是在筛选一个候选人的“系统认知水平”。所以不要把这些客观题当成单纯的“背诵题”。你在准备时最好能用自己的话把每个知识点讲明白最好能关联到真实业务场景。比如“索引为什么用B树而不是B树”如果你能结合“范围查询”来回答说明你是真懂。5.2 Java/C基本功容易丢分的地方研发方向笔试通常会给出一段代码让你选择输出结果或判断是否有编译错误。这时候你需要注意几个容易丢分的地方Java方向最常见的考点是equals与的区别、String不可变性、HashMap底层实现、静态变量与实例变量的初始化顺序、异常处理中finally的执行顺序、线程的几种创建方式。C方向则偏重指针和引用的区别、构造函数和析构函数的调用顺序、深拷贝和浅拷贝、虚函数和纯虚函数、内存泄漏的常见场景。如果你用的是Java也要看一点点C的基础概念因为有些选择题会用伪代码或类C语法。我当时就在“静态代码块和构造方法的执行顺序”这类题目上错过了。如果你也想稳一点建议复习一个经典面试题创建一个子类对象时父类静态代码块、子类静态代码块、父类普通代码块、父类构造方法、子类普通代码块、子类构造方法的执行顺序是什么。这道题几乎每年都会以某种变形出现。5.3 数据库与SQL容易被低估的得分区数据库题目在客观题中占比不低而且比网络和操作系统更容易得分因为它的考察点比较固定。核心范围包括SQL基础语法、索引原理与优化、事务的四大特性、并发事务带来的问题脏读、不可重复读、幻读、隔离级别、数据库三范式、常见瓶颈排查。SQL题尤其喜欢出“多表查询”和“分组聚合”。我的建议是考前一定亲手写一组典型SQL比如查询每个城市订单金额最高的用户、查询连续三天登录的用户、查询所有部门中平均工资高于某个值的部门。这些题目看着简单但如果你很久没写SQL可能连join的on条件都会写反。数据库索引方面至少要知道联合索引的最左前缀原则知道什么时候索引会失效比如对索引列使用函数或隐式类型转换。这部分内容在面试中也会反复出现笔试复习好了后面面试能省很多力气。6. 实战复盘一次典型笔试的全过程与踩坑记录6.1 开考前10分钟你能做什么在线笔试不像线下考试那样需要提前进考场去坐好但开考前10分钟依然可以做很多准备工作。我当时做的是提前把电脑充好电、关掉不必要的后台程序、把浏览器升级到符合考试系统要求的版本、提前登录考试页面、准备好学生证和身份证照片有些系统需要拍照验证。更重要的是提前准备好草稿纸和笔。不要觉得在线笔试不需要草稿纸实际上编程题做复杂状态设计时草稿纸是救命的东西。如果考试系统允许更改语言环境就提前切换到熟悉的IDEA或本地编辑器。有些系统自带编辑器功能很弱自动补全都不存在你最好提前练习一下裸写代码。我建议不管用哪个语言都要能流畅地写出链表的创建、反转、合并这些基础操作。6.2 编程题输入输出上的常见坑在线笔试最容易让人心态爆炸的问题往往是输入输出格式不对。我当时第一次参加某公司的笔试就是因为不熟悉“多组输入”的处理方式导致读入数据就错了后面所有逻辑都白写。这里总结几个常见坑多组输入有些题目说“输入包含多组测试数据每组占一行”你要用while(scanner.hasNext())这种循环去读而不是只处理一次。输出格式比如浮点数需要保留两位小数、每个结果占一行、末尾不能有额外的空格。这些细节都要逐字读题目。字符串包含空格如果用Scanner.next()读到的是空格分隔的单词而整行输入里有空格需要用nextLine()或BufferedReader去读。大整数如果数值超出了int范围要用long如果更大会超过long范围在Java里要用BigInteger在Python里不用太担心但C要注意long long。以上任何一个坑都可能让你写出正确的业务逻辑却拿不到分。我的习惯是写完代码后先手动构造一组包含空字符串、超大数字、特殊字符的测试数据进行验证再提交。6.3 遇到陌生题型时的止损策略万一真的遇到完全没有思路的题怎么办我的建议有三个层次第一先想一想这道题有没有非常暴力的解法。哪怕复杂度很高只要数据范围允许就能拿到部分分。比如动态规划不会写那可以尝试回溯枚举所有可能状态至少保证小数据正确。第二如果连暴力解法都很难写完整就把题目相关的关键代码片段写出来尽量向阅卷系统传递“我理解了一部分问题”。有些在线笔试系统会有“部分通过”的设定你提交的代码只要对某些测试点正确就会有对应分数。第三留出时间做检查。不要再死磕压轴题而是回头检查前面已经写好的题尤其是客观题的填涂和编程题的输出格式。很多时候检查一遍能“捡”回5到10分。止损的本质是把时间花在“确定能得分”的地方。别在一个题上跟它死磕该放就放该跳就跳。7. 笔试之后如何把经验反哺到面试准备7.1 成绩不理想时如何调整方向笔试结束后第一件事不是等结果而是复盘。把每道题的类型、当时卡住的原因、最终的解法记下来。如果你发现是因为某类数据结构题不熟就集中刷这个专题如果是因为时间不够就训练自己做题的速度和取舍能力。成绩不理想也不代表全盘皆输。有些公司笔试通过线是浮动的取决于候选人总体水平。如果你笔试分一般但面试表现很好依然有机会。反过来如果你笔试考得很好就绝不能放松因为不少人在笔试之后松懈反而在面试时翻车。我当时给自己定的计划是无论笔试感觉如何第二天开始系统地准备面试题。重点方向包括算法手写面试官可能当场出题、Java核心知识、项目深挖、场景设计题。笔试内容的很多知识点在面试时会被换个形式继续问复习一次等于双重受益。7.2 面试环节会如何延续笔试考点面试官拿到你笔试成绩后可能会针对薄弱点提问。比如你笔试时有一道动态规划题只拿了部分分面试官很可能会现场给你一道类似的动态规划题考察你能否在口头交流中理清思路。所以考后复盘的意义不只是为了这一场笔试更是为了预判面试问题。另外携程这类重视工程能力的团队面试中一般会有“场景设计”类问题。这类问题通常围绕高并发、缓存、消息队列、数据库分库分表展开。你在笔试阶段复习的操作系统、网络、数据库知识在这里会派上大用场。一个比较实用的做法是在笔试结束后把携程的业务模式和技术栈大致了解一下。比如携程的酒店、机票、度假、商旅等业务线对系统实时性和一致性要求都很高。如果你在面试里能提到“订单系统要保证可靠性和最终一致性”会显得你除了会刷题还有业务sense。7.3 适合大多数人的备考节奏根据我自己和身边同学的经验校招笔试备考比较理想的节奏是提前6到8周开始准备前两周用来了解目标公司的题型和范围中间三周用来专项刷题和补基础最后两三周做整套模拟卷和限时训练。不要把所有准备压到最后一周因为笔试不只是考知识点还考熟练度和时间管理。平时刷题建议用“按专题集中训练”代替“随机刷题”。比如一周只做链表相关的题把反转、合并、环检测、排序都做一遍形成条件反射。另一个方法是参加牛客网的周赛或模拟笔试这种限时比赛能帮你适应考试节奏。最后再分享一个小建议平时练习一定要写代码而不仅是看题解。很多知识点你一看以为自己懂了真到考场一写就卡壳。代码量的积累是骗不了人的写多了才有手感。携程研发方向的笔试难度没有到离谱的程度但它很考验你在压力下保持条理的能力。希望这篇复盘能帮你在准备时少走弯路把时间花在最值得的地方。
返回列表