腾讯校招编程题考点与实战复盘:从动态规划到ACM模式

发布时间:2026/9/1 22:07:48
腾讯校招编程题考点与实战复盘:从动态规划到ACM模式 腾讯校招的技术岗编程题我这些年帮不少学弟学妹做过复盘自己也断断续续研究过好几轮真题。如果只用一个词来形容它的风格我会选“务实”——它不考偏题怪题但特别喜欢在基础题里藏边界条件、在常规题里塞工程场景稍不注意就会翻车。这篇文章就把我整理和总结的腾讯校招技术类编程题考点、解题套路、实战复盘以及踩坑经验一次性写清楚希望能帮你少走弯路。这篇文章适合谁看主要面向准备投递腾讯校招技术岗后台、客户端、算法、数据分析等的同学也包括准备其他大厂校招但想用腾讯真题来练手的人。无论你目前是刚刷了五十题的新手还是已经刷了四五百题的老手这篇文章关注的都不是“多刷一道题”而是“怎么把一道题吃透、怎么在笔试环境里稳拿分”。1. 腾讯校招编程题的整体考情与考察风格腾讯校招技术类岗位的流程通常是简历筛选 → 在线笔试 → 技术初试一面→ 技术复试二面→ HR 面。其中在线笔试是刷人最狠的一关不少人的简历能过结果挂在笔试上。所以我先把这个环节拆明白。1.1 笔试流程与题目形态是 ACM 模式还是核心代码模式先说平台。腾讯校招笔试主要在牛客网和赛码网完成少数岗位可能会走内部的测评系统。这里有一个很多第一次参加校招的同学容易忽略的点牛客上的题目有的是“核心代码模式”——你只需要把函数实现补全输入输出不用管有的是“ACM 模式”——你需要自己写import sys、自己处理input()完整地输出结果。腾讯校招在线笔试大多数时候是 ACM 模式也就是需要你自己处理标准输入输出。这个区别很重要。我见过不止一个同学在力扣上刷得很顺结果校招笔试因为不会处理多行输入而卡了十几分钟。所以准备阶段一定要去牛客或赛码上练几道“需要自己处理输入输出”的题尤其是split()切分、多组数据、字符串中混合数字这些情况要练到不用想就能写出来。笔试时长一般在 90 到 120 分钟左右编程题 3 到 5 道有的岗位还会在前面加 20 道左右的选择题涉及网络、操作系统、数据库、语言基础等。编程题的分值占比很高而且通常不是按测试用例全过才给分而是部分通过也有部分分数。所以策略上一定要先捡软柿子捏把能拿的分都拿到。1.2 高频考点分布腾讯到底爱考什么我统计了一下近几年网络上的真题回忆和面经整理出一个大概的考点频率分布虽然不是官方数据但参考价值很高考点方向出现频率典型题型动态规划极高编辑距离、背包问题、最长上升子序列、股票买卖字符串处理与模拟很高字符串压缩/展开、表达式求值、IP 校验、格式转换数据结构基础很高栈与队列模拟、链表操作、二叉树遍历图论与搜索高BFS/DFS 网格题、拓扑排序、最短路径贪心算法中等区间调度、分配问题二分查找中等有序数组中找目标、最值问题前缀和/差分中等区间查询、连续子数组问题数论/数学较低质数、最大公约数、取模运算腾讯的题目风格有个特点非常讨厌“背模板就能过”的题目。同样的考点它往往会包一层业务外壳比如把一道 BFS 套在“地图导航”“消息转发”的背景下把一道模拟题套在“日志解析”“配置校验”的背景下。这跟腾讯实际业务中大量处理高并发请求、海量日志、用户数据的场景有关。所以你光会背模板不行还得能从题面里快速看出它考的是哪个模型。2. 高频题型的解题套路与思路拆解这一部分我按考点分类把每类题型的通用解法和容易踩的坑讲透。这里讲的不是某一道题而是一类题的处理框架。2.1 字符串与模拟题题目读完就“两眼一黑”怎么破字符串题在腾讯笔试里几乎是必考的因为现实中大量数据都是文本形式的。常见场景包括URL 解析、日志时间戳解析、配置文件格式校验、字符串压缩/解压、表达式求值。做这类题我建议按这样的步骤推进先把输入格式、输出格式用注释写下来明确输入是单行还是多行、分隔符是什么、输出是否需要保留某种顺序。设计边界用例尤其是空串、只有一个字符、全是空格、数字在边界上这些情况。再动手写代码。写的时候优先用简单的split()、replace()、正则表达式库不要自己实现字符串拆分。写完以后不要急着提交先在脑子里跑一遍示例再跑一遍极端输入。字符串题最常见的坑有三个第一是索引越界尤其在访问s[i1]时没判断i是否到了末尾第二是输出格式不对比如该用空格分隔却用了逗号第三是隐含的空格和不可见字符某些平台读入时会带\r或多余换行导致字符串比较失败。这类问题一般用strip()处理。2.2 动态规划腾讯笔试的“半壁江山”动态规划在腾讯笔试中的出场率高得离谱。可以这么说如果你动态规划掌握得不好腾讯笔试基本没戏。但好消息是腾讯考的动态规划很少是竞赛级的变态题大部分是经典模型的变体。我们需要做的就是把经典模型练到条件反射。腾讯常考的动态规划模型包括线性 DP最长上升子序列、最长公共子序列、最大子数组和背包类0-1 背包、完全背包、凑硬币类问题区间 DP合并石子、回文串分割状态机 DP股票买卖类字符串 DP编辑距离、正则匹配做 DP 题的核心不是背转移方程而是培养一个流程感。我自己的做题流程是先定义状态dp[i]或dp[i][j]到底表示什么是“以 i 结尾的最优值”还是“前 i 个元素的最优值”。想清楚状态转移即当前状态能从哪些更小的状态推过来。确定初始化和最终答案在哪。最后再考虑空间能不能优化滚动数组。一个关键提醒很多同学写 DP 时喜欢直接跳到“优化”这一步想着怎么把二维数组压成一维。但考试时优先保证正确性空间优化是在你有余力的时候再做的。先把朴素的二维写法写对能过就算赢。实际上很多笔试测试用例并没有大到必须用滚动数组的程度。2.3 树、图与搜索考的是编码基本功图论和树的题目在腾讯笔试中属于中高频通常不会出得太难但非常考验基本功。二叉树相关的题目主要围绕遍历展开前序、中序、后序、层序遍历以及由两种遍历还原二叉树。图相关的题目则以 BFS/DFS 网格题、拓扑排序、最短路径为主。先说树的遍历。腾讯喜欢考“非递归写法”因为递归写法太简单考察不出功底。所以准备阶段你不仅要会用递归写前序/中序/后序遍历还要会用栈模拟层序遍历要用队列。这个必须练到闭着眼睛都能写。再说图的 BFS/DFS。网格题二维矩阵是常考场景比如岛屿数量、腐烂的橘子、迷宫最短路径。核心套路就是在二维数组上做四个方向的遍历需要注意标记已经访问过的格子防止死循环优先用 BFS 求最短步数DFS 求连通性/路径条数。对于网格走迷宫这类题我建议直接用 BFS 而不是 DFS。原因是很多同学用 DFS 时容易忘记回溯而且 DFS 在求“最短路径”时需要遍历所有路径效率低且容易超时。BFS 天然适合求最短路径代码也更好写。只要记住用visited数组标记基本不会出错。3. 真题实战复盘从读题到 AC 的完整过程光讲套路不够下面我用三道典型的腾讯风格真题变体带你把从读题、分析、到写出代码的完整过程走一遍。这三道题分别对应模拟、动态规划、BFS 三个高频方向难度和真实笔试的中等题接近。3.1 实战一字符串连续字符压缩模拟题题目描述给定一个仅由小写字母组成的字符串将连续出现的相同字符压缩成“字符出现次数”的形式并保持原顺序输出。例如输入aabbbc输出a2b3c1。这个题看上去很简单但笔试时的通过率其实没那么高原因就是边界处理容易出问题。我先说思路从左往右扫描用count记录当前连续字符长度每当遇到新字符时把上一个字符和它的次数追加到结果字符串中。扫描结束后不要忘记把最后一组连续字符也追加进去。def compress(s): if not s: return res [] count 1 for i in range(1, len(s)): if s[i] s[i - 1]: count 1 else: res.append(s[i - 1] str(count)) count 1 res.append(s[-1] str(count)) return .join(res) s input().strip() print(compress(s))这里有两个关键点。第一if not s这行绝对不能省笔试时字符串为空是常见的边界用例。第二循环结束后要再 append 一次否则最后一组连续字符会丢。很多同学就是在循环里正常处理漏了最后一步导致示例用例通过率 80%扣了分。另外如果题目要求数字部分不带前缀零、字符数量很大时按十进制输出str(count)是安全的。但如果你遇到输出要求“仅对长度大于 1 的连续字符做压缩单字符保持不变”就需要加一个判断if count 1才追加数量。这类题要看清楚题目细节。3.2 实战二字符串编辑距离动态规划题题目描述给定两个单词 word1 和 word2计算将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行三种操作插入一个字符、删除一个字符、替换一个字符。编辑距离是一个非常经典的字符串 DP 题腾讯时不时会把类似模型换皮出现。它和业务场景的关联很明显比如搜索纠错、语音识别文本校正都用到编辑距离。解题思路是定义dp[i][j]为 word1 的前 i 个字符转换成 word2 的前 j 个字符所需的最小操作数。初始化时dp[i][0] i表示删除 i 个字符dp[0][j] j表示插入 j 个字符。转移方程分两种情况如果word1[i-1] word2[j-1]dp[i][j] dp[i-1][j-1]否则dp[i][j] 1 min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])其中dp[i-1][j]对应删除dp[i][j-1]对应插入dp[i-1][j-1]对应替换。def min_distance(word1, word2): m, n len(word1), len(word2) dp [[0] * (n 1) for _ in range(m 1)] for i in range(m 1): dp[i][0] i for j in range(n 1): dp[0][j] j for i in range(1, m 1): for j in range(1, n 1): if word1[i - 1] word2[j - 1]: dp[i][j] dp[i - 1][j - 1] else: dp[i][j] 1 min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) return dp[m][n] w1 input().strip() w2 input().strip() print(min_distance(w1, w2))这道题刷过的人很多但笔试时还是容易出错主要集中在这几个地方第一dp矩阵的维度是(m1) * (n1)而不是m * n因为至少要留出空串的位置第二初始化时两个循环的顺序无所谓但赋值不能漏第三如果输入的字符串可能包含空格就不能用input().strip()去掉首尾空格需要改用sys.stdin.readline()且不要 strip或者根据题目要求判断。这一点非常关键一定要先看清楚题目里字符串的构成规则。如果还想优化空间可以用两个一维数组滚动更新这样空间复杂度从 O(m*n) 降到 O(n)。但正如前面说的笔试时先保证二维写法正确。3.3 实战三岛屿数量BFS 网格题题目描述给定一个m x n的二维网格1表示陆地0表示水。请计算网格中岛屿的数量。岛屿被水包围并且通过水平或垂直方向相邻的陆地连接而成。这题是 BFS/DFS 的经典网格题几乎可以拿来当作腾讯图论题的代表。它考的就是最基本的“连通性计数”能力。思路是遍历每个格子如果发现格子是1且没有被访问过就把它作为起点进行一次 BFS把所有相连的陆地都标记为访问过同时岛屿数量加一。from collections import deque def num_islands(grid): if not grid: return 0 m, n len(grid), len(grid[0]) visited [[False] * n for _ in range(m)] count 0 directions [(1, 0), (-1, 0), (0, 1), (0, -1)] def bfs(x, y): queue deque() queue.append((x, y)) visited[x][y] True while queue: cx, cy queue.popleft() for dx, dy in directions: nx, ny cx dx, cy dy if 0 nx m and 0 ny n and not visited[nx][ny] and grid[nx][ny] 1: visited[nx][ny] True queue.append((nx, ny)) for i in range(m): for j in range(n): if grid[i][j] 1 and not visited[i][j]: count 1 bfs(i, j) return count # ACM 模式下输入示例第一行 m n接下来 m 行每行一个长度为 n 的字符串 import sys if __name__ __main__: lines sys.stdin.read().strip().split() m, n int(lines[0]), int(lines[1]) grid [] index 2 for _ in range(m): grid.append(list(lines[index])) index 1 print(num_islands(grid))这里我想多说一句输入处理的问题。很多同学平时在本地 IDE 写好的核心函数一到 ACM 模式就不知道怎么读数据。题目给的是“第一行两个整数 m n接下来 m 行字符串”如果用input()逐行读要注意第一行之后可能有多余空行所以用sys.stdin.read().split()统一读入再切分是更稳妥的做法。BFS 题还有一个容易忽略的细节入队时就要把visited标记为 True而不是出队时再标记。如果出队时才标记同一个节点可能会被多个方向重复加入队列虽然结果可能仍是对的但会浪费大量时间和内存严重时导致超时。4. 常见问题、时间规划与避坑指南前面讲了考点和实战这一部分我想把笔试过程中大家最容易遇到的实际问题集中整理一下顺便给出一份可执行的刷题规划。4.1 笔试过程中的典型问题速查表问题现象可能原因解决方案编译报错“数组越界”访问s[-1]或s[i1]时没做边界判断在循环前检查长度小于 1 时直接返回访问i1前判断i len(s)-1测试用例通过率始终卡在 90% 左右大概率是某个边界情况没处理检查空输入、单元素、全相同元素、出现次数为多位数等情况运行超时使用了时间复杂度太高的算法看数据范围如果 n 到 10^5O(n^2) 基本过不了需要换哈希/前缀和/二分优化输出和预期“差不多但不对”输出格式有问题仔细看题目要求的分隔符、是否要按原顺序、数字中间是否有空格读入多组数据时读少了input()只读了一行用sys.stdin.read()一次性读取再切分或者用while Truetry/except循环读提交后显示“非零退出码”代码中某处崩溃比如除零、空列表取[0]本地多测几个边界用例尤其是空列表、全零、只有一个元素这张表我建议你在笔试前花十分钟浏览一遍。很多问题不是不会做而是低级错误拖了后腿。笔试环境通常没有友好报错IDE 调试也没那么方便所以平时就要养成一遍写对的习惯。4.2 刷题路线与时间分配建议如果你距离笔试还有三个月以上可以按下面的路线来。如果只剩两周那就要有所取舍优先保高频考点。先说三个月版本第一个月基础巩固。刷《剑指 Offer》和牛客网“腾讯校招真题”里的简单题目标是熟悉笔试题型、掌握输入输出处理。第二个月专题强化。按动态规划、字符串、树与图、贪心、二分五大专题去刷每个专题至少刷 30 道题做到看到题面能快速归类。第三个月模拟实战。每周做 1 到 2 套完整笔试题严格按照考试时间不要中途查资料。重点练习时间分配和心态控制。如果只剩两周建议优先做三件事第一把腾讯近两年真题的考频统计看一遍重点投在动态规划和字符串模拟上第二每天至少手写一遍二叉树三种遍历的非递归实现和 BFS/DFS 网格题模板第三专门训练牛客网 ACM 模式的输入输出直到不再被读数据卡住。我还想补充一点关于“算法导论”和“面试手撕代码”的关系。校招笔试结束后面试环节通常还有一轮手撕代码面试官会现场给你出一道题让你在本地 IDE 或共享文档里写。这种场景和笔试不一样面试官更关注你的思考过程、代码风格和沟通能力。所以平时写代码时就要养成好习惯变量命名清晰、关键逻辑加注释、写完主动说复杂度。很多同学笔试没问题面试手撕却栽在“一声不吭写完”上这是很可惜的。再分享一个我自己的复盘习惯。每次做完一道题不管是对是错我都会在笔记里记录三个东西考点是什么、卡住我的点在哪、下次再遇到同类题应该先想什么。这比单纯刷题数量重要得多。你刷五百道题如果每道都是一遍过不如刷两百道题但每道都认真复盘。腾讯校招这几年也在变化比如部分岗位会结合云开发、微搭这类低代码场景出一些偏应用的题目但本质上考察的还是基础算法和数据结构的功底。所谓的编程题万变不离其宗核心就是把常见算法模型练成肌肉记忆同时练好在 ACM 模式下的代码输出能力。最后说说我个人在帮助别人刷题过程中最深的体会很多同学不是不会做题而是不会“在考试状态下”做题。要么死磕一道难题浪费了时间要么因为输入输出格式错了整题零分。所以平时模拟练习一定要用计时器按照真实笔试的节奏来。你现在的每一次模拟都是在为真正笔试那 90 分钟攒手感。希望你能从这篇文章里拿到一些实在的东西下一次打开牛客网做模拟题时心里更有底。