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

资讯详情

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

腾讯研发工程师模拟笔试题拆解:C++、数据结构、操作系统高频考点

腾讯研发工程师模拟笔试题拆解:C++、数据结构、操作系统高频考点 每年一到春招秋招就有不少人问腾讯研发工程师的笔试题到底怎么准备。我自己的习惯是不管目标公司是哪家先找一套有代表性的模拟题做一遍看看自己处在一个什么水平。去年整理资料时翻出了腾讯2016研发工程师在线模拟笔试题重新做了一遍感触挺多。这套题虽然叫“2016”但考察的知识点放在今天依然不过时——C、数据结构、操作系统、网络、数据库全都有难度比真实校招笔试略低一点非常适合用来做第一轮摸底自测。如果你正在准备大厂开发岗或者想检验一下自己计算机基础扎不扎实这套模拟题是一个很好的参照系。它能帮你快速暴露知识盲区也能让你提前感受在线笔试答题的节奏不至于第一次上考场就被时间压垮。这篇文章我会从整体结构、高频考点、编程题实战、错题复盘四个角度拆解这套模拟题顺便把我当年刷题踩过的坑也放进来希望对你有实际帮助。1. 先看整体这套模拟笔试题到底在考什么1.1 题型结构与答题节奏腾讯这套在线模拟笔试题从形式上看和现在的牛客网企业笔试页面基本一致限时、自动计分、提交后不能修改答案。题目类型以客观选择题为主涵盖单选和多选部分版本还会附带一两道编程题。时间一般给到60到90分钟题量大约在25到40题之间。选择题的分布是有规律的因为研发工程师岗位需要兼顾“广度”和“深度”所以你会发现它几乎每个方向都会出几道数据结构与算法大概占五分之一C/C语言基础占五分之一操作系统和计算机网络各占六分之一数据库、设计模式、Linux常用命令等杂项占剩下的部分。这个比例其实透露了一个信息腾讯研发岗笔试不要求你在单一领域像个专家但要求你没有明显的短板。答题节奏上我的建议是“前快后慢”。前面的基础选择题每道尽量不要超过一分钟拿不准的先凭第一印象选一个然后标记不要恋战。但是系统往往不提供“标记”功能所以遇到卡壳的题我的策略是先跳过去后面再回来蒙一个剩余时间最紧张的选项尽量不要让一道题拖住整个节奏。说实话很多人在真实笔试里不是不会做而是死磕一道题最后后面十道明明会做的题没时间看这很可惜。1.2 难度分层与命题意图这套模拟题的难度设计是有梯度感的。前三分之一基本是送分题考察概念记忆比如“进程和线程最根本的区别是什么”“TCP三次握手的第二次握手携带什么标志位”。中间三分之一开始上强度需要你会算、会推比如给你一段代码问输出结果或者给出多个排序算法在不同情况下的复杂度比较。最后三分之一是拉分题经常出现“以下哪些说法正确”的多选题这类题最讨厌的地方在于四个选项往往包含两个很对、一个模棱两可、一个故意混淆的概念稍不留意就会漏选或多选。命题意图其实很清晰筛选知识面宽、基础扎实、思维严谨的人。腾讯这种体量的公司新入职工程师要面对的代码量非常大如果连内存分配、线程同步、TCP状态机这些基本概念都模棱两可后面带起来太费劲。所以它宁可出一道“偏难怪”的概念辨析题也不愿意出“背一背就会”的简单题。理解到这个层面你就知道复习时不能只看面经里那几十道题得把每道题背后的知识树展开连根带叶地过一遍。2. 高频考点逐个拆解那些年我们一起做错的选择题2.1 算法与数据结构不背模板刷思路这套模拟卷的数据结构题常考两类。一类是“基础操作的结果”比如给一棵二叉树的前序和中序遍历要求判断后序遍历另一类是“复杂度与特性比较”比如快速排序在什么情况下退化成O(n²)哈希表解决冲突的方法有哪些。我印象很深的一道模拟题是“若有向无环图用邻接表存储则拓扑排序的时间复杂度是”这道题看着简单但很容易错选成O(n²)。实际上拓扑排序用 Kahn 算法或DFS实现每个顶点入队一次、每条边访问一次所以总复杂度是O(VE)。很多人背下了“邻接矩阵是O(V²)邻接表是O(VE)”这句话却不知道为什么换了问法就不会了。我建议碰到这种知识点时顺手把两种存储结构下的遍历、排序、连通性判断都推导一遍把复杂度的来源搞清楚而不是死记结论。再比如常见的排序算法稳定性判断。选择题里喜欢给一串待排序的数字然后问“哪种排序算法是稳定的”很多人的答案是“插入排序稳定、堆排序不稳定”这种口诀。但题目稍微变一下“在链式存储结构上哪些排序算法不再适用”就立刻一批人翻车。比如快速排序在链式存储上虽然可以实现但性能收益不明显而堆排序需要随机访问链表上实现很别扭。这类题目没有套路只有你真的理解每种排序的底层逻辑才能当场推理出来而不是靠背。2.2 C语言基础指针、内存、编译链接C是当年腾讯笔试的重头戏现在也依然是主力语言。模拟卷里关于C的题目几乎绕不开三类指针与引用、内存布局、编译链接过程。指针类的题最爱考的就是“数组名什么时候代表整个数组什么时候退化为指针”。比如sizeof(arr)和sizeof(arr)的区别或者char *p hello; *p之后p指向哪里。这类题对做过项目的人不难但对只刷题不看内存模型的应届生来说就是送命题。我自己的心得是遇到指针题别去猜直接在草稿纸上画内存格子把栈、堆、全局区、字符常量区都标出来90%的指针题都能靠画图解决。内存布局题更直接常见的是给一个结构体问你sizeof(struct)等于多少。这种题关键要记住内存对齐规则每个成员起始地址必须是自身对齐数的整数倍结构体总大小必须是最大对齐数的整数倍。2016年那套题里有一道经典题struct A { char a; int b; char c; };在32位系统上sizeof(A)是多少很多人想都不想直接填6但正确答案是12。因为b要4字节对齐a后面要补3个填充字节c占1个字节后又要补3个字节保证总大小是4的倍数。后来我在真实笔试里又碰到过类似的题掌握对齐规则以后这一类基本就是送分。编译链接的知识点模拟题里喜欢考“哪些错误发生在编译期哪些发生在链接期”。比如未定义的外部变量、重复定义的全局函数、头文件里定义了非inline函数分别是什么错误前两个都是链接错误最后一个则是多重定义链接错误。理解了编译器和链接器的分工编译器管语法和类型检查链接器管符号解析和地址重定位这类题就不会错。2.3 操作系统与网络概念理解别停留在背诵操作系统这一块进程线程区别、死锁条件、虚拟内存、调度算法是常客。模拟题里有一道很典型的“以下哪个是死锁的必要条件”很多同学只背了四个条件——互斥、持有并等待、不可剥夺、循环等待但题目变成“如何预防死锁对应破坏哪个条件”就开始犯糊涂。我的方法是把四个条件每个都找一个生活例子互斥像一个人只能同时用一支笔持有并等待像你拿着MacBook还要跟别人抢充电器不可剥夺像别人不能在你没写完时抢走你的笔循环等待像A等B、B等A。这样理解后看到选项里“破坏循环等待就是按固定顺序申请资源”立刻就能判断出来。网络部分的题集中在TCP/UDP。模拟题里有道经典计算题“TCP连接建立时初始序号为1000发送的SYN报文段消耗了一个序号那么第一个数据字节的序号是多少”答案是1001因为SYN标志要占一个序号。如果你不理解“序号消耗”这个概念总以为数据序号还是1000那就掉坑里了。另一个常考的是TIME_WAIT状态存在的原因——保证最后一次ACK能到达对端以及让旧连接的报文段在网络中消逝防止干扰新连接。网络题最怕只背“三次握手、四次挥手”却不理解状态迁移。我推荐自己画一遍状态转移图从CLOSED开始沿着主动打开、被动打开、握手、数据交换、挥手把每个状态标注上画完你就会发现什么情况下收到RST什么情况下进入TIME_WAIT全都清楚了。3. 编程题怎么练从模拟题到真实机试的实战方法3.1 常见编程题类型与输入输出陷阱腾讯的在线模拟笔试题有时候会包含编程题而且真实笔试几乎必考。常见题型包括字符串处理、数组操作、链表、二叉树、动态规划等。但很多第一次参加在线笔试的同学不是死在算法上而是死在输入输出上。在线判题系统要求你自己写输入输出解析这与平时练习LeetCode时只需要实现函数完全不一样。比如读一行包含多个整数的字符串你要自己用cin或者scanf提取有些题目的输入用逗号分隔你需要处理字符。2016年那套模拟题里见过一道字符串反转题要求从标准输入读入一句话反转单词顺序后输出。题目本身不难但不少人因为忘记处理末尾换行符而卡住。我整理了几个容易踩的输入输出坑如果一行有多个整数但个数未知需要用while (cin x)循环读取直到文件结束。如果输入含逗号、分号需要先用getline读入整行再按逗号分割。输出末尾有没有多余空格虽然不总是报格式错误但有些判题系统会因此判定WA。注意题目要求输出的精度保留几位小数用printf(%.2f)还是cout fixed setprecision(2)。3.2 一道典型模拟题的推演全过程我们拿一道模拟题里常出现的“两数之和”变形来演示完整的做题思路。题目是“给定一个整数数组和一个目标值target请找出数组中两个数的下标使得它们的和等于target。可以假设每组输入只有一个答案且同一个元素不能使用两次。输入输出如第一行是数组长度n第二行是n个整数第三行是target输出两个下标小下标在前。”拿到题后我的第一步不是直接写代码而是先在草稿纸上模拟。比如数组[2, 7, 11, 15]target是9肉眼就能看出279答案是0和1。接着我会想边界情况数组只有两个数能不能用有负数怎么办答案唯一但两个相同值相加等于target怎么办比如[3, 3]target是6答案应该是0和1。这里如果使用哈希表就能正确处理相同值的情况。暴力解法是两层循环时间复杂度O(n²)空间复杂度O(1)。如果数组长度只有100这个方案问题不大。但真实笔试往往会把n推到10的5次方以上所以必须优化。我们可以用一个哈希表在遍历数组的同时记录每个数最后一次出现的下标。每访问一个元素nums[i]先查一下target - nums[i]是否在哈希表中如果在立即返回答案如果不在就把当前数和下标存进去。我自己在试卷上写出来的C代码如下#include iostream #include vector #include unordered_map using namespace std; int main() { int n, target; cin n; vectorint nums(n); for (int i 0; i n; i) { cin nums[i]; } cin target; unordered_mapint, int pos; for (int i 0; i n; i) { int need target - nums[i]; if (pos.find(need) ! pos.end()) { cout pos[need] i endl; return 0; } pos[nums[i]] i; } return 0; }这个解法的时间复杂度是O(n)空间复杂度也是O(n)。写完以后千万不要直接提交要自己造几个用例跑一遍比如n2, nums[3,3], target6输出0 1。nums[-1,-2,-3], target-5输出1 2。nums[1,2,3], target10没有答案程序正常结束。确认这些用例都通过后再考虑一下内存限制如果n很大使用unordered_map可能比map更合适因为哈希表平均O(1)查找而红黑树是O(log n)。但要注意哈希表在极端情况下可能退化好在判题数据一般不会故意卡这一点。3.3 机试环境的实战技巧在线笔试的编程题环境和本地IDE差别不小。现场没有断点调试也没有自动补全所以平时就要养成写代码“一步到位”的习惯。首先代码风格要稳定。变量命名清晰函数拆分成小段这样出Bug时靠肉眼也能找到问题。不要写五六百行的大函数判题系统不会因为你“代码写得漂亮”加分但你自己调试时会舒服很多。其次要主动处理边界值。我每次提交前都会在脑子里过一遍这些场景输入为空、只有一个元素、最大值、最小值、重复元素、逆序数组、全相同数组。很多时候你提交后编译错误看一下错误信息多半是变量声明冲突或者数组越界。再次注意编译器的差异。在线系统默认使用C11或C14但有的老编译器不支持unordered_map初始化列表或者不支持auto遍历。稳妥起见如果你不确定编译器版本就用最基本的#include bits/stdc.h加标准命名空间这种写法在大多数在线系统上都没问题但在某些严格环境会报错。更好的做法是在做题前先看一眼系统提供的语言版本和用法说明。最后时间分配上我给编程题预留至少20到30分钟。不要一上来就写代码花5分钟读懂题意和输入输出格式再花5分钟设计算法和复杂度再用10到15分钟写代码和自测。哪怕最后没有完全AC通过部分测试用例也能拿到一部分分数这比交一个空白代码强太多。4. 复盘与查漏从错题中挤出的涨分点4.1 错题归因归类做完整套模拟题最重要的一步是复盘。很多人做完对一遍答案看个分数就结束了这是最浪费的做法。分数只是一个数字错题背后的原因才是你能涨分的地方。我习惯把所有错题分成三类知识型错误、熟练度型错误、失误型错误。知识型错误就是你根本不知道这个知识点或者理解有偏差。比如你不知道TCP的TIME_WAIT状态发生在主动关闭方这就是知识盲区需要回到教材或者网课里把这部分内容补上。熟练度型错误就是你明明会但题目一变型就反应不过来。比如排序算法稳定性换个数据结构问你就不确定。这说明你对知识的应用不够灵活需要多刷变式题。失误型错误就是会做但因为粗心做错比如没看清“选不正确的”或者忽略了“数组下标从1开始”。这类错题最可惜但往往也最能通过考试技巧避免。我的建议是准备一个错题表格把每道错题记录的列分成“题号、考点、错误原因、正确思路、同类题推荐”像下面这样题号考点错误原因正确思路12结构体内存对齐没考虑b的4字节对齐先画内存布局再算填充字节18TCP序号消耗忘记SYN占一个序号SYN/FIN标志位各消耗一个序号25多选死锁条件把“循环等待”和“持有并等待”混淆四个条件逐一对应实际场景整理完错题再针对“知识型错误”去补课一次只补一个薄弱模块效果最好。4.2 高效的复习路径针对薄弱点如果你做完这套模拟题发现操作系统错得最多那么接下来一周就应该集中攻克操作系统而不是又回头盲目刷题库。我在准备笔试时用的方法是“模块化突击”先根据错题统计出薄弱模块然后花2到3天的时间把该模块的核心知识体系过一遍再用10到15道该模块的练习题检验是否补上。举个例子如果网络部分错得多你可以按照“应用层 → 传输层 → 网络层”的顺序梳理重点把TCP和UDP的区别、三次握手和四次挥手、拥塞控制的状态变化画成图。不要只看概念要结合实际场景为什么视频通话用UDP、文件传输用TCP为什么有时候上网卡顿是拥塞控制导致这些问题的答案其实都在选择题的选项里。对于数据库常考点就是索引、事务隔离级别、B树、两阶段锁等。我见过模拟题里有一道“InnoDB默认隔离级别是什么”答案是Repeatable Read。很多人会记成Read Committed。这时候不要只记答案要想清楚四种隔离级别分别解决什么问题脏读、不可重复读、幻读。理解了这些概念你怎么都不会选错。复习路径上我强烈建议“教材题库错题”三件套轮动而不是只看面经。面经只能告诉你考什么但你要真正理解背后的原理才能应对题目的各种变种。5. 常见问题速查模拟题阶段最容易踩的坑5.1 关于系统与规则在线模拟笔试系统跟真实笔试系统几乎一致所以有一些硬坑必须提前知道。第一提交是一锤定音很多系统不允许你返回来修改前面已经答过的题目。模拟题可能还能随意退但真实考试中如果你点了下一题前面的答案就锁定了所以每做一题都要慎重。第二选择题多选少选都不得分这点很关键。腾讯这种大厂的笔试多选题通常判分很严多选、少选、错选都算零分。所以遇到不确定的多选题宁可少选一个也不要为了赌分去选一个自己都没把握的选项。第三编程题的编译环境可能不同有的系统默认Java有的默认C你使用时要注意选择正确语言。我自己就吃过亏某次模拟题里我把代码写在int main()里但没写return 0;本地IDE能过但在线系统提示非零退出码检查了半天才发现是这个问题。在线判题对返回码很敏感主函数最好显式返回0。5.2 关于备考心态与时间分配做模拟题的时候分数不理想是正常的千万别崩溃。我第一次做类似的模拟卷网络部分错了将近一半那会儿也很沮丧。但后面我把所有错题都啃了一遍半个月后再做另一套模拟题准确率明显提升。时间分配上如果你现在离笔试还有两周以上建议每天花2到3小时分三个环节第一个小时刷题第二个小时复盘第三个小时针对错题补知识点。如果只剩三天那就不要追求大面积扫知识点而是把你最薄弱且最容易考的模块抓住比如数据结构、C基础这俩性价比最高。至于那些已经比较熟的内容每天过一遍保持手感就行。最后一个小技巧做模拟题的时候尽量模拟真实考试的环境开一个计时器把手机放远一点中间不要暂停。这能帮你训练在时间压力下的心态也更容易暴露你在“快速判断”上的弱点。我第一次计时做题时发现前面犹豫太久后面选择题全靠蒙后来专门训练了“一题不准超过90秒”的规则真实考试时才稳下来。这套腾讯2016研发工程师在线模拟笔试题做完之后可能会让你怀疑自己但这恰恰是它的价值。作为一次自我检阅它能帮你把模糊的知识点变得清晰把隐藏的薄弱的环节暴露出来。平时多流汗战时少流血把所有错题吃透等真正走进笔试考场的那一刻你心里会踏实很多。
返回列表