ARTICLE DETAIL

资讯详情

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

从2017腾讯校招笔试题看大厂开发岗考察重点与备考策略

从2017腾讯校招笔试题看大厂开发岗考察重点与备考策略 2017年那会儿腾讯校招的笔试还是传统的一套“客观题编程题”的组合试卷还会分成一二三好几套平行卷。说实话现在回看这份“开发工程师笔试试卷二”很多题放在今天依然是面试手撕代码环节的原型甚至有些考点在LeetCode上换个马甲继续高频出现。这篇文章我就结合当年这张卷子的题型分布、核心考点和备考逻辑聊聊大厂校招笔试到底在筛什么以及如果你现在正备战大厂开发岗该怎么从这份“老试卷”里提取真正有用的东西。适合谁看计算机相关专业准备校招的同学、半路转码想冲大厂的人、还有想系统补基本功的初级工程师。我会尽量把每类题背后的考察意图讲清楚而不是单纯报菜名式地罗列知识点。1. 试卷整体结构与命题思路1.1 当年的笔试形式与试卷构成2017年腾讯校招开发岗笔试线上答题一般分两部分。第一部分是客观题单选、多选、填空混在一起覆盖C/C、数据结构、操作系统、计算机网络、数据库、Linux基础这些计算机核心课程。第二部分是编程题通常是2到4道在线OJ提交支持C/C/Java等主流语言。这里有个细节试卷编号“二”代表这是平行卷之一。腾讯当时为了防作弊同一场考试会出多套难度相当、题目不同的卷子ABCD卷随机分发。所以你在网上看到的“试卷二”不一定对应某个特定岗位后台开发、客户端开发、前端开发共用一套基础卷再加岗位附加题但它考查的知识面基本就是那几大块。当时我印象比较深的是客观题里混了一些“阅读理解”型的C语言题比如给一段指针操作的代码问输出是什么。这类题看着简单但非常考基本功尤其是指针、数组、结构体内存布局这些平时写业务代码不常碰一考就露馅。1.2 这份试卷值得翻出来的三个理由第一它的考点覆盖非常经典。2017年的卷子里考的虚函数表、进程线程区别、TCP三次握手、B树索引到现在依然是面试必问题。计算机基础知识迭代慢五六年过去核心内容并没有变。第二它反映了大厂命题的底层逻辑——不考偏题怪题。腾讯笔试题很少出那种“你背过就会、没背过就废”的冷门知识点它考的是你能否用学过的基础知识解决一个具体问题。这种命题思路至今没变。第三它是很好的自测清单。把这张卷子的考点逐个过一遍你基本能判断自己计算机基础扎不扎实。我后来帮人做模拟面试也经常拿这套题来摸底效果比很多“速成宝典”实在。2. 核心考点深度拆解2.1 C/C与内存管理这一块在2017年的客观题里占比很高因为后台开发主力语言就是C。考点集中在指针和引用的区别、const的各种用法、static关键字在不同场景下的含义、虚函数和多态的实现原理、内存对齐与sizeof计算、堆栈区别、内存泄漏排查。举一个当年很典型的题给出一个struct定义里面有char、int、short类型成员问sizeof(struct)是多少。这道题考的是内存对齐。规则是每个成员的首地址必须是其自身对齐数的整数倍结构体总大小必须是最大对齐数的整数倍。比如struct A { char a; // offset 0占1字节 int b; // 对齐数4offset要补到4占4字节 short c; // 对齐数2offset补到8占2字节 }; // 总大小10但最大对齐数是4补到12当年很多人在这种题上丢分不是不知道规则而是不够熟练。这里有个小技巧把成员按从大到小排序声明能减少padding浪费。日常开发中如果你设计的结构体要被网络传输或持久化存储内存布局就更重要了涉及序列化字节序时尤其要注意。虚函数那部分常常考“一个类里有虚函数sizeof是多少”。这题是考虚函数指针vptr的存在。只要类里有虚函数编译器就会在对象内存里插入一个指向虚函数表vtable的指针在64位机器上是8字节。所以一个只有虚析构函数的空类sizeof是8而不是1。2.2 数据结构与算法数据结构是这场笔试的大头。链表、二叉树、栈、队列、哈希表是基础排序算法更是必修课。2017年的卷子里排序相关题几乎是必出的比如问快排平均时间复杂度和最坏时间复杂度或者给一组数问归并排序的过程中某一步的结果。为什么大厂这么执着于排序因为排序是理解递归、分治、复杂度分析的最佳载体。我当时复习时把六大排序算法冒泡、选择、插入、快排、归并、堆排全部手写了一遍每个都分析最好、最坏、平均时间复杂度和空间复杂度以及稳定性。这个功夫没白费笔试遇到排序题基本秒杀后面面试手撕快排也不慌。数据结构题还有一类很典型给定场景选数据结构。比如“需要频繁在头部和尾部插入删除选什么容器”“需要按键有序遍历选什么”。这类题考的是对容器底层实现的理解。C里vector、list、deque、map、unordered_map的区别和适用场景就是高频考点。那会儿还喜欢考手写链表反转、判断链表是否有环、找链表中间节点。这些后来成了LeetCode的经典题但当时没有那么多刷题平台大家就是在纸上画链表把每个指针的指向变化理清楚。2.3 操作系统与计算机网络操作系统这块进程和线程的区别是必考题。2017年的题目喜欢用生活化场景来考比如“多个线程同时读一个变量需不需要加锁”。这题其实是在考线程共享内存模型同一进程的线程共享地址空间所以读同一个变量本身不需要加锁但如果存在写操作且不是原子操作就需要同步机制来保证数据一致。进程间通信方式也是高频考点管道、消息队列、共享内存、信号量、socket。每种方式的优缺点、适用场景都要能说清楚。当时我总结了一个记忆方法管道是单向字节流消息队列是结构化消息共享内存是最快但需要同步socket是跨机器的通信方式。死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待以及处理方法也经常出现在选择题里。网络部分TCP的二次握手四次挥手几乎是必考。前面几轮面试问的比较多的是三次握手为什么不能两次以及四次挥手中的TIME_WAIT状态为什么需要等待2MSL。笔试里更常考的是分析状态比如给一个tcpdump抓包的输出问当前连接处于什么状态。HTTP和HTTPS的区别、HTTP状态码的含义也是基本盘。2017年那会儿HTTP/2刚普及不久卷子里也有涉及问多路复用解决了什么问题。放在今天如果你能顺带聊到HTTP/3和QUIC会是个加分项。2.4 数据库与Linux数据库重点在SQL基础、索引原理、事务ACID特性、范式。索引必考B树理解为什么用B树而不是红黑树或哈希。一个简洁的回答思路B树非叶子节点只存索引不存数据所以单节点能容纳更多关键字树更矮叶节点用链表串联适合范围查询和排序磁盘IO次数少。再一个高频考点是SQL语句排查给一个需求让你选正确的SQL或者看执行计划判断有没有走索引。这种题考的是实际开发经验只背概念是不够的。比如“在name列上建了索引执行WHERE name LIKE %abc%会不会走索引”——不会因为前导通配符无法利用B树的有序性。Linux部分常用命令是必考grep、awk、sed、find、top、netstat、ps这些是基础。笔试里常给一个运维场景问用什么命令。比如“查看某个端口被哪个进程占用”用netstat -tunlp | grep 端口号或者ss更高效。这些命令实际工作中天天用但当年笔试前我还专门背了一遍参数因为有些参数平时记不住。3. 编程题解题思路与核心代码实现3.1 典型题原型最长回文子串编程题里有一类高频题是字符串处理。我给一个当年常考的变体思路还原求一个字符串的最长回文子串长度。最直观是暴力解法枚举所有子串判断是否回文时间复杂度O(n^3)显然不是面试官想要的。中心扩展法把每个字符以及每两个相邻字符之间当作回文中心向两侧扩展时间复杂度降到O(n^2)空间O(1)。再进阶就是Manacher算法线性复杂度。我建议准备笔试时把这三种解法都写一遍。不是要你在笔试中写出Manacher而是通过一题多解训练自己在约束条件下选方案的能力。笔试时间紧张中心扩展法足够对付大多数字符串回文题面试中再讲Manacher能体现深度。核心代码中心扩展法int expandAroundCenter(const string s, int left, int right) { while (left 0 right s.size() s[left] s[right]) { left--; right; } return right - left - 1; } int longestPalindrome(const string s) { if (s.empty()) return 0; int start 0, maxLen 1; for (int i 0; i s.size(); i) { int len1 expandAroundCenter(s, i, i); int len2 expandAroundCenter(s, i, i 1); int len max(len1, len2); if (len maxLen) { maxLen len; start i - (len - 1) / 2; } } return maxLen; }3.2 典型题原型LRU缓存设计LRULeast Recently Used是另一道高频编程题。2017年那会儿各大厂笔试面试都喜欢考它因为既能考察数据结构选型又能考察设计能力。它的核心是get和put操作的时间复杂度都要是O(1)。这决定了单纯用数组或链表都做不到——数组的随机访问是O(1)但插入删除是O(n)链表的插入删除是O(1)但查找是O(n)。正解是哈希表加双向链表哈希表负责O(1)查找双向链表负责O(1)插入和删除。class LRUCache { private: struct Node { int key, value; Node* prev; Node* next; Node(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {} }; unordered_mapint, Node* cache; Node* head; Node* tail; int capacity; void removeNode(Node* node) { node-prev-next node-next; node-next-prev node-prev; } void addToHead(Node* node) { node-next head-next; head-next-prev node; node-prev head; head-next node; } public: LRUCache(int capacity) : capacity(capacity) { head new Node(0, 0); tail new Node(0, 0); head-next tail; tail-prev head; } int get(int key) { if (!cache.count(key)) return -1; Node* node cache[key]; removeNode(node); addToHead(node); return node-value; } void put(int key, int value) { if (cache.count(key)) { Node* node cache[key]; node-value value; removeNode(node); addToHead(node); } else { if (cache.size() capacity) { Node* node tail-prev; removeNode(node); cache.erase(node-key); delete node; } Node* node new Node(key, value); cache[key] node; addToHead(node); } } };这类题面试官真正看的是你的设计思路为什么选这两种数据结构组合边界情况怎么处理容量满时怎么淘汰把这些讲清楚代码写不写得完反而是次要的。3.3 其它高频编程题套路从2017年的卷子和近几年的高频题来看还有几类编程题值得多练。第一大数相加/大数相乘。这题考察的是模拟笔算过程核心是进位处理。关键是先把字符串反转按位加最后处理进位。代码本身不难但要注意前导零、负数这些边界情况。第二二叉树的层序遍历。这题考队列的运用很基础但很常考。进阶版本是之字形遍历、右视图、最大宽度等变体。我建议把层序遍历作为基础模板练熟之后其它变体基本是在模板上改逻辑。第三字符串去重/字符计数类。这类题适合用哈希表或数组计数如果字符范围有限比如只有小写字母用int[26]比unordered_map更高效。2017年的笔试里也有类似题考的是空间复杂度的优化意识。4. 从2017到2024校招笔试的变与不变4.1 题目形式和考核方式的变化2017年的笔试是网页上做题纯在线OJ提交后系统自动判分。现在的大厂笔试也大致如此但有几个明显变化。一是从“黑盒提交”到“核心代码模式”。以前要求你自己处理输入输出现在LeetCode风格的核心代码模式成了主流只需要实现一个函数。这对考生来说省去了不少IO处理的时间。二是新增了选择题里的“场景题”。比如给一段线上故障描述问排查思路。这种题更接近实际工作单纯背八股文很难答好。腾讯尤其喜欢在笔试题里加入一些工程实践题考你面对真实问题时的分析能力。三是AI相关岗位的分化。2017年那会儿“开发工程师”就只有一个大类。现在从热搜词里能看到“AI应用开发工程师”“大模型全栈工程师”“智能体开发工程师”这些细分岗位考题也分化了。大模型岗位会考Transformer结构、RAG、Prompt工程这些在2017年根本不存在。4.2 考点权重的迁移基础题依然是基本盘但权重有所调整。C/C的占比在JAVA和Go岗位里明显下降但对于腾讯这种C重镇后台开发依然重视。我看到的趋势是算法题变简单了一点以前手写红黑树旋转这种硬核题基本绝迹更多是考“在特定业务场景下选什么数据结构”。系统设计题变多了现在笔试里偶尔会出现“设计一个短链系统”“设计一个排行榜”之类的简答题这在2017年一般只在面试环节出现。计算机基础仍然老四样操作系统、网络、数据库、数据结构笔试中大概占60%以上。想在笔试环节不翻车这四门课必须扎扎实实过一遍。4.3 热词背后AI和云时代的开发者看相关热搜词“腾讯云”“腾讯微搭”“腾讯乐固”“腾讯地图”这类产品和“AI应用开发工程师”“智能体开发工程师”这些岗位其实反映出腾讯目前的技术生态重心在向云和AI倾斜。如果现在参加校招即使投的是“开发工程师”岗也免不了被问到跟云原生、微服务、容器相关的东西。我对“AI应用开发工程师”和“AI全栈开发工程师”的理解是前者更偏向使用现成的大模型API、RAG框架、Agent框架做业务落地后者除了这些还要能自己搭模型服务、调优推理性能甚至训练微调。这跟2017年“开发工程师”考的是纯基本功不太一样。但有趣的是无论岗位多么新数据结构、操作系统、网络这些笔试第一关从来没变过。这也给现在的求职者一个启示别只看热词追新基础不牢新词聊得再溜也过不了笔试。5. 备考建议与经验心得5.1 三个月准备路线如果现在离笔试还有三个月我的建议是分三个阶段走。第一阶段前6周地毯式过基础。把数据结构、操作系统、网络、数据库这四门课的核心知识点过一遍配合做课后题。目标是看到一道题能立刻反应出它在考哪个知识点。这个阶段不用急着刷题先把知识框架搭起来。第二阶段中间4周刷题。以LeetCode和牛客网为主按标签刷数组、链表、二叉树、动态规划、字符串。先刷简单和中等的抓住高频题。LeetCode上的“Top 100 Hot Questions”是一个不错清单把它刷两遍笔试的算法题基本能覆盖八成。第三阶段最后2周模拟笔试。找一整段时间完整做一套模拟卷严格计时。编程题要用OJ模式练手熟悉输入输出和调试流程。这个阶段尤其要培养时间分配意识算法题如果10分钟没思路先跳过把能拿的分拿到。5.2 错题本是核心武器我在备考时建了一个Markdown文件记录每一道错题题目描述、错误原因、正确思路、同类题链接。这个文件到最后大概有120多道题。不要小看这个动作校招复习的知识点非常多如果不做整理一周前刷过的题可能就忘了。错题本还有一个用法考前只看它。最后一周不刷新题只看错题本上的“错误原因”因为这代表你的思维盲区。把盲区补上比再刷100道新题更有效。5.3 我踩过的坑第一个坑是“重算法轻基础”。我当时花了很多时间刷LeetCode困难题结果客观题里操作系统和网络反而丢了不少分。笔试是客观题和编程题一起算分的编程题占40%客观题占60%基础不牢很吃亏。第二个坑是“只刷不总结”。刷题只是输入总结才是消化。我见过很多同学刷了500多题但面试时还是说不清楚思路因为只是记住了答案没有形成自己的解题思维。第三个坑是“不练手写代码”。笔试是键盘输入但有些公司面试会让手写代码。2017年的面试环节我就遇到过手写快排平时练的是IDE手写时各种小毛病。建议平时偶尔用纯文本编辑器写代码逼自己一遍写对。另外还有一个容易被忽略的读题。笔试题目描述很长而且有时候有干扰信息。我第一次做模拟卷时有一道题读完前两行就开始写写完才发现理解错了白白浪费20分钟。后面我养成了先读最后一段“输入输出描述”再回看题干的习惯效率高很多。最后说几句实在话考完这么多年回头看腾讯这份2017年校招笔试卷子考的内容确实“老”但这种“老”恰恰是计算机行业的底色。从C内存布局到TCP状态流转从B树到LRU这些知识十年后依然是大厂面试的硬通货。区别在于现在的考生有了更多刷题平台和学习资料但知识核心没有变。如果你正在准备校招我的建议就一句话把基础打牢把高频题刷透把错题嚼碎。做到这三件事无论遇到2017年的老卷子还是2024年的新题型你都能从容应对。
返回列表