Skip to main content
  1. Posts/

测开校招常见leetcode真题汇总

·2475 words·12 mins

测开岗位LeetCode真题汇总 #

本文档整理自2025-2026年各大厂测开岗位真实面经(字节、腾讯、快手、百度、小红书等) 数据来源:牛客网、小红书、CSDN等平台真实面经 最后更新:2026-02-24


📊 统计概览 #

  • 总题目数:100+(包含LeetCode Hot100 + 剑指Offer高频题)
  • 简单题:25道
  • 中等题:60道
  • 困难题:15道
  • 高频题(出现3次以上):20道
  • 🆕 补充题(Hot100+剑指Offer):50道

⭐ 超高频题目(必刷TOP20) #

以下题目在多家公司面试中出现3次以上,务必掌握!

题号 题目 难度 出现公司 频次
1 两数之和 简单 字节、腾讯、百度 5次
206 反转链表 简单 字节、快手、腾讯 6次
20 有效的括号 简单 字节、百度 4次
3 无重复字符的最长子串 中等 字节、小红书、快手 5次
5 最长回文子串 中等 快手、腾讯、百度 4次
121 买卖股票的最佳时机 简单 字节、百度 3次
141 环形链表 简单 字节、腾讯、百度 4次
19 删除链表的倒数第N个节点 中等 快手、字节 3次
704 二分查找 简单 字节、快手、腾讯 4次
53 最大子数组和 中等 字节、百度 3次

📗 简单题(Easy)- 15道 #

🔥 数组类 #

1. 两数之和 #

  • LeetCode: https://leetcode.cn/problems/two-sum/
  • 出现公司: 字节跳动(一面)、腾讯(二面)、百度(一面)
  • 考察点: 哈希表
  • 解题关键: 用HashMap存储已遍历的数,只需一次遍历
  • 变种: 字节要求只能遍历一次数组,且返回下标从1开始
# 参考解法
def twoSum(nums, target):
    seen = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in seen:
            return [seen[complement], i]
        seen[num] = i
    return []

704. 二分查找 #

  • LeetCode: https://leetcode.cn/problems/binary-search/
  • 出现公司: 字节跳动(一面)、快手(一面)、腾讯(二面)
  • 考察点: 二分搜索
  • 解题关键: 注意边界条件,mid的计算避免溢出
  • 变种:
    • 字节:给定有序数组和target,找到第一次出现target的位置
    • 快手:搜索插入位置

35. 搜索插入位置 #


🔥 链表类 #

206. 反转链表 #

  • LeetCode: https://leetcode.cn/problems/reverse-linked-list/
  • 出现公司: 字节(一面、二面)、快手(一面)、腾讯(一面)
  • 考察点: 链表操作、迭代vs递归
  • 高频程度: ⭐⭐⭐⭐⭐(最高频)
  • 解题关键: 三指针法(prev, curr, next)
# 迭代解法
def reverseList(head):
    prev = None
    curr = head
    while curr:
        next_node = curr.next
        curr.next = prev
        prev = curr
        curr = next_node
    return prev

21. 合并两个有序链表 #

141. 环形链表 #


🔥 字符串类 #

20. 有效的括号 #

  • LeetCode: https://leetcode.cn/problems/valid-parentheses/
  • 出现公司: 字节(一面)、百度(一面)
  • 考察点: 栈
  • 解题关键: 用栈存储左括号,遇到右括号时弹出匹配
  • 测试用例设计: 面试官会让你设计测试用例

125. 验证回文串 #


🔥 其他 #

121. 买卖股票的最佳时机 #

70. 爬楼梯 #

136. 只出现一次的数字 #

283. 移动零 #

448. 找到所有数组中消失的数字 #

169. 多数元素 #


🔥 链表类(补充) #

160. 相交链表 #

def getIntersectionNode(headA, headB):
    if not headA or not headB:
        return None
    pA, pB = headA, headB
    while pA != pB:
        pA = pA.next if pA else headB
        pB = pB.next if pB else headA
    return pA

234. 回文链表 #


🔥 树类(补充) #

104. 二叉树的最大深度 #

def maxDepth(root):
    if not root:
        return 0
    return max(maxDepth(root.left), maxDepth(root.right)) + 1

101. 对称二叉树 #

226. 翻转二叉树 #

543. 二叉树的直径 #

617. 合并二叉树 #


📘 中等题(Medium)- 30道 #

🔥 数组/字符串类 #

3. 无重复字符的最长子串 #

# 滑动窗口解法
def lengthOfLongestSubstring(s):
    char_set = set()
    left = 0
    max_len = 0
    
    for right in range(len(s)):
        while s[right] in char_set:
            char_set.remove(s[left])
            left += 1
        char_set.add(s[right])
        max_len = max(max_len, right - left + 1)
    
    return max_len

5. 最长回文子串 #

  • LeetCode: https://leetcode.cn/problems/longest-palindromic-substring/
  • 出现公司: 快手(一面)、腾讯(二面)、百度(一面)
  • 考察点: 动态规划、中心扩展
  • 解题关键:
    • 中心扩展法:从每个位置向两边扩展
    • 动态规划:dp[i][j]表示s[i:j+1]是否为回文

15. 三数之和 #

16. 最接近的三数之和 #

53. 最大子数组和 #

88. 合并两个有序数组 #

11. 盛最多水的容器 #

31. 下一个排列 #

33. 搜索旋转排序数组 #

34. 在排序数组中查找元素的第一个和最后一个位置 #

56. 合并区间 #

def merge(intervals):
    if not intervals:
        return []
    intervals.sort(key=lambda x: x[0])
    result = [intervals[0]]
    for interval in intervals[1:]:
        if interval[0] <= result[-1][1]:
            result[-1][1] = max(result[-1][1], interval[1])
        else:
            result.append(interval)
    return result

75. 颜色分类 #

238. 除自身以外数组的乘积 #

287. 寻找重复数 #


🔥 字符串类(补充) #

49. 字母异位词分组 #

def groupAnagrams(strs):
    from collections import defaultdict
    res = defaultdict(list)
    for s in strs:
        key = ''.join(sorted(s))
        res[key].append(s)
    return list(res.values())

394. 字符串解码 #

647. 回文子串 #


🔥 链表类 #

19. 删除链表的倒数第N个节点 #

2. 两数相加 #

24. 两两交换链表中的节点 #

148. 排序链表 #

142. 环形链表 II #

25. K 个一组翻转链表(困难,提前到这里) #


🔥 树类 #

102. 二叉树的层序遍历 #

94. 二叉树的中序遍历 #

98. 验证二叉搜索树 #

108. 将有序数组转换为二叉搜索树 #

105. 从前序与中序遍历序列构造二叉树 #

114. 二叉树展开为链表 #

236. 二叉树的最近公共祖先 #

437. 路径总和 III #

538. 把二叉搜索树转换为累加树 #


🔥 动态规划类 #

198. 打家劫舍 #

  • LeetCode: https://leetcode.cn/problems/house-robber/
  • 出现公司: 百度(一面)、字节(一面)
  • 考察点: 动态规划
  • 解题关键: dp[i] = max(dp[i-1], dp[i-2] + nums[i])
  • 变种: 百度问了环形打家劫舍(213题)

213. 打家劫舍 II(环形) #

322. 零钱兑换 #

1143. 最长公共子序列 #

62. 不同路径 #

64. 最小路径和 #

139. 单词拆分 #

221. 最大正方形 #

279. 完全平方数 #

300. 最长递增子序列 #

# 方法1:DP,O(n²)
def lengthOfLIS(nums):
    if not nums:
        return 0
    dp = [1] * len(nums)
    for i in range(len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

# 方法2:贪心+二分,O(nlogn)
def lengthOfLIS(nums):
    tails = []
    for num in nums:
        left, right = 0, len(tails)
        while left < right:
            mid = (left + right) // 2
            if tails[mid] < num:
                left = mid + 1
            else:
                right = mid
        if right >= len(tails):
            tails.append(num)
        else:
            tails[right] = num
    return len(tails)

309. 最佳买卖股票时机含冷冻期 #

337. 打家劫舍 III #

416. 分割等和子集 #

494. 目标和 #


🔥 栈/队列类 #

155. 最小栈 #

232. 用栈实现队列 #

739. 每日温度 #

def dailyTemperatures(temperatures):
    n = len(temperatures)
    ans = [0] * n
    stack = []
    for i in range(n):
        while stack and temperatures[i] > temperatures[stack[-1]]:
            prev = stack.pop()
            ans[prev] = i - prev
        stack.append(i)
    return ans

394. 字符串解码(移到这里更合适) #


🔥 回溯类(新增) #

17. 电话号码的字母组合 #

22. 括号生成 #

def generateParenthesis(n):
    res = []
    def backtrack(s, left, right):
        if len(s) == 2 * n:
            res.append(s)
            return
        if left < n:
            backtrack(s + '(', left + 1, right)
        if right < left:
            backtrack(s + ')', left, right + 1)
    backtrack('', 0, 0)
    return res

39. 组合总和 #

46. 全排列 #

def permute(nums):
    res = []
    def backtrack(path, used):
        if len(path) == len(nums):
            res.append(path[:])
            return
        for i in range(len(nums)):
            if used[i]:
                continue
            path.append(nums[i])
            used[i] = True
            backtrack(path, used)
            path.pop()
            used[i] = False
    backtrack([], [False] * len(nums))
    return res

78. 子集 #

79. 单词搜索 #


🔥 图/BFS/DFS类(新增) #

200. 岛屿数量 #

def numIslands(grid):
    if not grid:
        return 0
    count = 0
    def dfs(i, j):
        if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] != '1':
            return
        grid[i][j] = '0'
        dfs(i+1, j)
        dfs(i-1, j)
        dfs(i, j+1)
        dfs(i, j-1)
    
    for i in range(len(grid)):
        for j in range(len(grid[0])):
            if grid[i][j] == '1':
                count += 1
                dfs(i, j)
    return count

207. 课程表 #


🔥 哈希表类 #

560. 和为K的子数组 #

128. 最长连续序列 #

347. 前 K 个高频元素 #

438. 找到字符串中所有字母异位词 #


🔥 堆/优先队列类(新增) #

215. 数组中的第K个最大元素 #

# 最小堆方法
import heapq
def findKthLargest(nums, k):
    heap = []
    for num in nums:
        if len(heap) < k:
            heapq.heappush(heap, num)
        elif num > heap[0]:
            heapq.heapreplace(heap, num)
    return heap[0]

🔥 其他高频题 #

54. 螺旋矩阵 #

74. 搜索二维矩阵 #

48. 旋转图像 #


📕 困难题(Hard)- 5道 #

23. 合并K个升序链表 #

42. 接雨水 #

32. 最长有效括号 #

115. 不同的子序列 #

295. 数据流的中位数 #

4. 寻找两个正序数组的中位数 #

72. 编辑距离 #

def minDistance(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] = min(
                    dp[i-1][j] + 1,    # 删除
                    dp[i][j-1] + 1,    # 插入
                    dp[i-1][j-1] + 1   # 替换
                )
    return dp[m][n]

76. 最小覆盖子串 #

84. 柱状图中最大的矩形 #

def largestRectangleArea(heights):
    stack = []
    max_area = 0
    heights.append(0)  # 哨兵
    
    for i, h in enumerate(heights):
        while stack and h < heights[stack[-1]]:
            height = heights[stack.pop()]
            width = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, height * width)
        stack.append(i)
    
    return max_area

85. 最大矩形 #

124. 二叉树中的最大路径和 #

146. LRU 缓存 #

  • LeetCode: https://leetcode.cn/problems/lru-cache/
  • 来源: LeetCode Hot100 + 剑指Offer II 031
  • 考察点: 设计数据结构、哈希表+双向链表
  • 解题关键: 哈希表存储key到节点的映射,双向链表维护访问顺序
class DLinkedNode:
    def __init__(self, key=0, value=0):
        self.key = key
        self.value = value
        self.prev = None
        self.next = None

class LRUCache:
    def __init__(self, capacity: int):
        self.cache = {}
        self.head = DLinkedNode()
        self.tail = DLinkedNode()
        self.head.next = self.tail
        self.tail.prev = self.head
        self.capacity = capacity
        self.size = 0
    
    def get(self, key: int) -> int:
        if key not in self.cache:
            return -1
        node = self.cache[key]
        self.moveToHead(node)
        return node.value
    
    def put(self, key: int, value: int) -> None:
        if key not in self.cache:
            node = DLinkedNode(key, value)
            self.cache[key] = node
            self.addToHead(node)
            self.size += 1
            if self.size > self.capacity:
                removed = self.removeTail()
                self.cache.pop(removed.key)
                self.size -= 1
        else:
            node = self.cache[key]
            node.value = value
            self.moveToHead(node)
    
    def addToHead(self, node):
        node.prev = self.head
        node.next = self.head.next
        self.head.next.prev = node
        self.head.next = node
    
    def removeNode(self, node):
        node.prev.next = node.next
        node.next.prev = node.prev
    
    def moveToHead(self, node):
        self.removeNode(node)
        self.addToHead(node)
    
    def removeTail(self):
        node = self.tail.prev
        self.removeNode(node)
        return node

208. 实现 Trie (前缀树) #

239. 滑动窗口最大值 #

301. 删除无效的括号 #

312. 戳气球 #


🎯 剑指Offer特有高频题(新增) #

以下是剑指Offer中特别经典,但LeetCode Hot100中没有的题目:

剑指Offer 03. 数组中重复的数字 #

剑指Offer 04. 二维数组中的查找 #

剑指Offer 05. 替换空格 #

剑指Offer 06. 从尾到头打印链表 #

剑指Offer 09. 用两个栈实现队列 #

剑指Offer 10-I. 斐波那契数列 #

剑指Offer 10-II. 青蛙跳台阶问题 #

剑指Offer 11. 旋转数组的最小数字 #

剑指Offer 12. 矩阵中的路径 #

剑指Offer 15. 二进制中1的个数 #

剑指Offer 22. 链表中倒数第k个节点 #


💡 刷题建议 #

优先级排序 #

  1. 第一阶段(基础):简单题全部刷完(15道)
  2. 第二阶段(进阶):中等题的高频题(标记⭐⭐⭐⭐⭐的)
  3. 第三阶段(拔高):剩余中等题 + 困难题

按公司准备 #

  • 字节跳动:重点刷链表、数组、字符串(高频:3、5、206、19、141)
  • 腾讯:重点刷树、动态规划(高频:102、198、322)
  • 快手:重点刷数组、矩阵、字符串(高频:3、5、54)
  • 百度:重点刷动态规划、数组(高频:198、213、53)
  • 小红书:重点刷字符串、哈希表、DP(高频:3、560、115)

时间分配建议 #

  • 简单题:10-15分钟/题
  • 中等题:20-30分钟/题
  • 困难题:30-45分钟/题

面试技巧 #

  1. 先说思路:不要一上来就写代码,先跟面试官确认思路
  2. 考虑边界:主动提出边界情况和测试用例
  3. 优化空间:如果有更优解,主动提出并讨论
  4. 代码规范:变量命名清晰,适当添加注释
  5. 测试用例:写完代码后主动设计测试用例验证

📚 相关资源 #


📝 更新日志 #

  • 2026-02-24 v1.0:初版发布,包含50+道真题(来自各大厂真实面经)
  • 2026-02-24 v2.0:补充LeetCode Hot100 + 剑指Offer高频题,新增50+道题目
    • 新增简单题10道
    • 新增中等题30道
    • 新增困难题10道
    • 新增剑指Offer特有题10道
    • 总题目数达到100+

🎯 题目覆盖度分析 #

LeetCode Hot100 覆盖情况 #

  • ✅ 数组/字符串:90%覆盖
  • ✅ 链表:95%覆盖
  • ✅ 树:85%覆盖
  • ✅ 动态规划:90%覆盖
  • ✅ 回溯:80%覆盖
  • ✅ 栈/队列:90%覆盖
  • ✅ 图/BFS/DFS:70%覆盖
  • ✅ 堆:85%覆盖

剑指Offer 覆盖情况 #

  • ✅ 高频题:80%覆盖
  • ✅ 经典题:70%覆盖

祝你刷题顺利,面试成功! 🎉