十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

滴滴2016研发笔试题解析:数组指针、链表与TCP核心考点

滴滴2016研发笔试题解析:数组指针、链表与TCP核心考点 滴滴出行2016研发工程师笔试题这份试卷在技术社区的题库里躺了很多年但今天翻出来看含金量一点没缩水。当年参加这场笔试的人现在大多已经在各家互联网公司成了技术骨干而试卷上反复出现的数组、指针、链表、进程线程、TCP协议这些考点依然是如今国内互联网公司研发岗笔试的标配内容。我这篇博文就围绕这套题的考点展开把每类题目的考察意图、解题思路、容易踩的坑逐一拆开给正在准备秋招的朋友一份可以直接参考的备考清单也帮已经工作几年的老工程师回头补补基本功。不管你是主攻Java还是C/C不管目标是滴滴还是其他大厂这套题背后的知识体系都值得认真过一遍。1. 试卷整体结构与考点分布1.1 笔试题型与考察范围先看试卷结构。2016年前后的互联网公司研发岗笔试主流形态是“选择题 编程题”少数公司会加填空题和简答题。滴滴这份笔试题一整体延续了这个套路大致可以分成两部分客观选择题主要覆盖C/C语言基础、数据结构、操作系统、计算机网络。编程大题以算法设计为主常见的有数组处理、链表操作、字符串处理、简单动态规划或贪心。从考点占比来看互联网公司研发笔试的分布很固定大致是语言基础约30%数据结构与算法约40%操作系统和计算机网络约20%其他杂项Linux命令、数据库、设计模式、智力题约10%。滴滴这套题也基本符合这个规律。之所以形成这种结构是因为笔试的本质是海选工具在有限的时间内用标准化题目快速筛掉基础不扎实的候选人。选择题客观、易判、覆盖面广编程题则能直接反映写代码的硬功夫两者结合是成本最低的初筛方式。如果你对比过国企或传统软件公司的笔试题会发现它们的口味明显不同——更偏向Java基础语法、数据库SQL、Linux操作命令算法题占比很低。而滴滴这类互联网公司更看重计算机底层功底和算法思维因为线上业务的高并发、高可用场景最终都要落到数据结构、操作系统、网络这些基础课上。1.2 为什么研发岗笔试偏爱这些考点很多同学会问工作里每天写业务代码谁还手写反转链表、手写快排这个问题我当年也困惑过。后来做了几年面试官慢慢理解了笔试考点的设计逻辑。以数组和指针题为例它考察的不是“你会不会用数组”而是“你是否真正理解内存模型”。C/C里数组名和指针的关系直接反映一个人对栈区、堆区、地址偏移这些概念的理解程度。写业务代码时你可能永远不需要手动管理内存但如果连sizeof(arr)和sizeof(p)的区别都说不清面试官很难相信你能排查内存泄漏、分析线上崩溃问题。算法题同理。手写一个层序遍历或反转链表看起来和实际工作没直接关系但它考察的是逻辑思维是否严密、代码风格是否干净、边界条件是否敏感。这些素质恰恰是研发工程师最重要的底层能力。系统设计、性能优化、故障排查归根结底都在用这套思维方式。所以与其吐槽笔试题脱离实际不如把每一道题背后的知识点吃透它们才是支撑你走得更远的地基。2. 高频题型逐题拆解从读懂题意到写出满分答案2.1 数组与指针C/C考生必过的第一关数组和指针是笔试选择题里的绝对主力几乎每套试卷都会出现2到3道。因为C/C笔试是当时大陆公司研发岗的主流选择滴滴这套题自然也不例外。这类题考察的点很集中核心就是对内存模型的理解。先看一道出镜率极高的经典题。以下代码在64位平台上输出什么#include stdio.h #include string.h int main() { char str[] hello; char *p str; printf(%lu %lu\n, sizeof(str), sizeof(p)); printf(%lu %lu\n, strlen(str), strlen(p)); return 0; }正确答案是6 8和5 5。str是数组sizeof(str)等于整个数组占用的内存字符串hello有5个字符加上结尾的\0所以是6字节。p是指针64位平台下指针占8字节和它指向的内容无关。而strlen关心的是字符串内容它数到\0就停所以两个都是5。这个题的坑在于如果你把str作为参数传进函数情况就不一样了。看下面这版void func(char arr[]) { printf(%lu\n, sizeof(arr)); }输出是8不是6。因为数组作为函数参数时会退化成指针char arr[]本质上就是char *arrsizeof计算的永远是指针的大小。理解这一点就理解了C语言里“数组参数退化”的规则。再来看另一个高频变体二维数组的指针偏移int a[3][4]; int *p a[0];问a 1、a 1、p 1分别指向哪里。a作为数组名在表达式中代表指向首元素的指针首元素是一个长度为4的int数组所以a 1跨过4个int。a取的是整个二维数组的地址a 1直接跨过整个a数组也就是跳过了12个int。p是int*p 1只跨过1个int。这道题把“数组名、取地址、指针算术”三个核心概念一次考透是经典中的经典。给准备笔试的同学一个实操建议遇到sizeof相关题目先判断对象是数组类型还是指针类型遇到指针加减先问自己一句“当前指针指向的基本单位是什么”。这两个习惯能帮你避开80%的陷阱。2.2 算法设计现场手写代码的得分点算法编程题是笔试的重头戏也是拉分项。选择题大家靠积累编程题则直接暴露你的代码硬实力。滴滴这套题的编程题风格和同时期其他大厂类似不会出太偏难怪的题基本都是经典算法的高频变体Two Sum、反转链表、链表判环、数组去重、二分查找边界、最长公共子序列等。以“找出数组中出现次数超过一半的数字”为例这题在2016年前后的笔试出现率极高。最直观的解法是排序后取中间值时间复杂度O(n log n)。但如果你知道摩尔投票法就能写出O(n)时间、O(1)空间的满分答案public int majorityElement(int[] nums) { int candidate nums[0]; int count 1; for (int i 1; i nums.length; i) { if (count 0) { candidate nums[i]; count 1; } else if (nums[i] candidate) { count; } else { count--; } } return candidate; }摩尔投票法的核心思想是“不同元素互相抵消”。出现次数超过一半的元素即使和其他所有元素一一抵消最后也一定会剩下来。因此用一个计数器遇到相同的候选就加一遇到不同的就减一计数归零时更换候选。这个过程不容易一眼看懂但代码实现非常简洁。笔试判分时面试官看重的是三点思路是否清晰、边界是否处理干净、复杂度是否达标。我见过很多同学代码能跑通但没写注释、变量名全是a b c或者只写出O(n log n)版本而不知道有O(n)解法。这些都是扣分点。正确姿势是先在草稿纸上写清楚思路和复杂度再动手敲代码写完后用一两个特殊用例空数组、全相同元素、长度1自测一遍。这类算法题背后其实有一个共同套路很多题都可以归为“如何用哈希表/双指针/单调栈/动态规划来优化暴力解法”。刷题时不要满足于AC多想想为什么这个解法能成立有没有更优方案这样在笔试现场遇到新题才不会慌。2.3 系统与网络基础研发工程师的底线知识操作系统和计算机网络的选择题占分不如算法高但往往是你和别人拉开差距的地方。原因很简单这两块知识靠考前突击很难补必须是真的理解过、实践过才能答对。先看操作系统的高频考点。进程与线程的区别是必考题核心考点在于进程是资源分配的基本单位线程是CPU调度的基本单位同一进程下的线程共享内存空间而进程之间相互独立线程切换的开销比进程小因为不需要切换地址空间。配套的扩展考点还有多线程共享哪些资源、独占哪些资源、线程安全怎么保证、死锁的四个必要条件以及如何破坏。死锁题尤其喜欢考“如何破坏循环等待条件”标准答案是资源有序分配法给所有资源编号线程只能按编号递增的顺序申请资源。这类题目的意义在于分布式系统和数据库并发控制中都大量应用了类似的资源管理思路。计算机网络同样是选择题大户最经典的是TCP三次握手和四次挥手。不要只背“三次握手、四次挥手”这六个字笔试喜欢挖细节为什么握手是三次不是两次为什么挥手要四次而不是三次TIME_WAIT状态为什么需要等待等等。我建议每个准备笔试的人都亲手画一遍“输入URL到页面展示”的完整流程DNS解析、TCP连接建立、HTTP请求发送、服务器处理、响应返回、浏览器渲染。这个链路题几乎是大厂面试的标配画明白这一条链路DNS、TCP、HTTP、浏览器渲染的知识点就串起来了比零散背题效率高得多。再来一道网络选择题实例HTTP与HTTPS的区别标准答法是HTTP明文传输HTTPS在HTTP和TCP之间多了TLS/SSL加密层HTTPS默认端口443HTTP默认端口80HTTPS通过证书验证服务器身份能防止中间人攻击。深层考点则是TLS握手过程中如何交换密钥、如何保证完整性这些内容在系统设计面试里还会反复出现。3. 答题策略与时间分配3.1 两套时间分配方案笔试现场最大的敌人不是题目太难而是时间不够。2016年滴滴这套题整体难度属于中等偏上选择题大约25道编程题3到4道总时长120分钟。如果没想好时间策略很容易出现前面选择题纠结太久、后面编程题草草了事的局面。我的建议是先做选择题后做编程题但选择题要严格控制时间。这是因为选择题只需要勾选答案不需要构造思路做起来性价比高编程题哪怕想得慢通常也能在白纸上写点思路拿过程分。具体到120分钟可以这样分配环节建议用时策略要点第一轮选择题25分钟会做的直接选不会的立刻标记跳过第二轮回头补选择题10分钟优先处理标记题再纠结难题编程题三道70分钟每题约20分钟最后留10分钟检查机动时间15分钟压轴题、复查答案、补注释如果是90分钟的笔试把选择题压缩到20分钟编程题压缩到60分钟机动时间10分钟。核心思路不变选择题一旦卡住超过2分钟永远先跳过回头有空再想。很多同学一遇到选择题就犯强迫症非要选出答案才往下走结果一道题磨了5分钟后面编程题全乱了。我把这叫作“单题局部最优导致全局劣优”是做笔试的大忌。3.2 答题顺序与取舍策略做题顺序也有讲究。我个人的习惯是三遍式第一遍扫一遍全卷把会做的题全部解决掉尤其是那些一眼就能看出答案的送分题先把它们拿稳第二遍回头啃标记过但有点思路的题第三遍才是难题和压轴题。编程题的顺序建议按熟练度来不按题目顺序。如果你对链表题最熟就先写链表那道如果你擅长动态规划就先写动态规划那道。把最有把握的先解决不仅保证得分还能建立信心避免因为第一道编程题卡壳导致后面全崩。编程题的取舍也有技巧。如果一道题思考了10分钟还没有完整思路不要死磕先写一个暴力解保证能过部分用例再把复杂解的核心优化思路写在注释里。笔试判卷时暴力解有机会拿30%到50%的分空着则一定是0分。写下过程和思路非常关键——很多公司有面试官人工复核笔试答卷你的解题思路比答案本身更能反映能力即使最终代码不能完全跑通清晰的思路也能给你争取一面机会。4. 从笔试到面试这道题背后的准备方向4.1 按专题训练把题库过成体系笔试不是终点面试才是。笔试题目里暴露出的薄弱点如果不及时补上面试时会被追问得更狠。我见过太多人笔试算法题写出来了面试官追问“为什么这里用哈希表不用数组”“这个复杂度还能不能再优化”直接卡壳。所以备考要按专题系统过不要零散刷题。按数据结构分类建议按这个顺序准备数组和字符串 → 链表 → 栈和队列 → 二叉树 → 哈希表 → 图 → 动态规划 → 贪心。每个专题至少练习15到20题并总结出这个专题的常见套路。比如链表题的核心套路就是“哑节点 双指针”二叉树题的核心套路是“递归 迭代栈”动态规划题的核心套路是“定义状态 → 找转移方程 → 确定边界条件”。再细化一点链表题有一类高频变体就是“判断链表是否有环并找到环的入口”。快慢指针找环是经典解法但找到入口需要再推一步相遇后慢指针继续走、快指针重置为头节点并改为一步走两者再相遇的位置就是入口。这个推导过程经常被面试官要求现场讲清楚如果你只背答案不会推一追问就露馅。做题之余把每一步推导搞懂才是真的在准备面试。Java方向的同学还可以多留意JVM内存模型、并发编程、集合源码这些笔试选择题里的“编外考点”。2016年后Java岗位逐渐增多很多公司的笔试会加入Java专项选择题HashMap的底层结构、ConcurrentHashMap如何保证线程安全、ArrayList和LinkedList的区别、synchronized和volatile的区别。这些既是笔试高频题也是面试必问题建议提前整理出自己的话术不要只会背名词。4.2 把项目经历串起来让知识落地笔试考的是知识面试考的是应用。面试官看到你的简历写“参与过XX系统的性能优化”大概率会追问“底层是怎么做性能分析的服务吞吐量为什么从1000提升到3000JVM参数怎么调整的Full GC为什么减少了”这些问题本质上都在考操作系统、网络、数据结构的基础原理。所以准备校招时不要只埋头刷题要把自己的项目经历做一次“考点映射”。比如你做过一个Web服务可以试着问自己用户请求从进入到返回经过哪些环节每个环节可能有什么性能瓶颈对应网络、操作系统如果用户量增大10倍哪个组件最先成为瓶颈数据库应用服务器带宽对应系统设计服务日志量很大用什么数据结构、什么算法统计出高频接口对应数据结构与算法如何保证多线程并发请求下数据的一致性对应并发编程这个过程能帮你把笔试学到的知识真正内化面试时也更有底气。不要等到拿到面试通知再突击笔试准备阶段就同步开始整理效率最高。5. 踩坑实录与备考建议5.1 笔试现场最常见的三个翻车点第一个翻车点是审题不仔细。题目要求O(n)时间复杂度你写了个O(n log n)的排序解法用例能过但分数很低要求原地修改数组你又新开了一个数组要求处理空输入你直接对第一个元素取下标跑起来就抛异常。我的习惯是编程题动笔前把题目里的限制条件用笔圈出来写完后对照限制条件自查一遍。第二个翻车点是边界条件处理不完整。二分查找的left right还是left right循环结束后的返回值是什么链表反转后头节点是否指向null递归的退出条件是否覆盖了长度为0的情况。边界条件通常只占代码量的10%却决定了代码正确率的90%。建议准备一个边界条件检查清单空输入、单元素输入、元素重复、溢出、指针为null每道题写完都按清单过一遍。第三个翻车点是代码风格太随意。我批改笔试时见过不少代码变量名是a、b、c没有缩进没有注释核心逻辑混在一起根本看不清。这类代码即使算法对了也容易被扣印象分。建议平时刷题就养成规范习惯函数名用动词开头、变量名见名知义、关键步骤写一行注释、复杂逻辑拆成小函数。这些习惯在面试手撕代码时也是加分项。另外提醒一下笔试环境往往和你平时开发环境差别很大很多公司的在线笔试系统不提供本地编译器需要直接在网页代码框里写代码。这意味着不能依赖IDE的自动补全和语法检查。平时练习时尽量用纯文本编辑器写代码再放到IDE里验证编译提前适应这种“裸写”的紧张感。5.2 刷题方法论少走弯路的三个习惯最后聊一下有效的备考节奏。我不建议一上来就搞题海战术更推荐“专题突破 思维导图 错题复盘”的组合。第一个习惯是专题突破。设定每周只刷一个专题的题目比如这一周专攻二叉树。好处是能快速建立同类题型的模式识别能力看到中序遍历立刻想到递归或栈看到层序遍历立刻想到队列。如果今天刷链表明天刷图知识点是散的遇到新题很难联想到解法。第二个习惯是画思维导图或笔记。每做完一类题把通用套路、边界陷阱、复杂度分析记下来。比如动态规划专题你的笔记里可以整理出“背包问题从二维到一维滚动数组优化的过程”“最长递增子序列怎么从O(n²)优化到O(n log n)”这份笔记既是你的知识库也是考前复习的提纲。第三个习惯是错题复盘。每周抽一天回顾本周做错的题先不看答案自己重新写一遍然后问自己当时为什么错是没理解题意、边界没想到、还是解法选错了把错误原因写下来之后定期翻看。我见过太多人同一道题刷了三遍还是错在同一个地方不反思只刷题效率非常低。我还想特别说一句押题不如押知识网。2016年滴滴这套题里的考点到今天依然是各大厂笔试面试的核心。数组指针、链表反转、二叉树遍历、进程线程、TCP握手这些东西不会因为技术迭代而过时因为它们是计算机科学的基石。真正应该做的是把这些基础知识点串成一张网而不是赌今年会考哪道原题。6. 对这套题的整体复盘与实战心得这套题刷完之后我最大的感受是它的难度不在于单个题目的深度而在于知识面的广度。你可能精通算法但操作系统选择题照样丢分你可能网络基础扎实但C语言指针题依然困惑。所以准备这类笔试拼的是谁的基本盘更均衡谁更少有明显短板。我建议在正式投递简历前先做两套历年真题模拟。严格按照真实笔试的时间限制和流程来做不要中途查资料不要延长作答时间模拟完再复盘。我第一次模拟时选择题花掉了40分钟编程题只剩40分钟最后只完整写出了1道编程题。第二次模拟时调整了策略编程题写了2道半感觉完全不一样。模拟的意义不是做对多少题而是提前暴露你的时间分配和答题习惯问题。复盘时还有一个容易被忽略的点留意你自己在选择题上反复纠结的题目类型。如果你每次都在TCP状态或者指针偏移上卡住就把这类题整理成一个专题集中突破。这种定向补弱比大面积刷题更快见效。回到这套“滴滴出行2016研发工程师笔试题一”坦白讲它并没有特别炫技的题目所有的坑和考点都在基础范围内但它完整地勾勒了那个时代互联网公司研发岗的能力画像语言基本功扎实、数据结构敏感、算法思维清晰、系统知识够用。这四条到现在依然成立。如果你能把这份试卷的每一道题都吃透把背后的知识点连成体系那么走进任何一家公司的笔试考场你都会更有底。最后分享一个我自己的小习惯笔试前一天的晚上不刷题只看自己的思维导图和错题笔记提纲挈领地过一遍知识框架。带着“我已经系统准备过”的状态走进考场比临时抱佛脚刷几道新题有用得多。笔试准备是一个长期积累的过程不急不躁把基本功练扎实你的代码和思路自然会替你说话。
返回列表