TikTok OA 的算法题,最近几轮考下来有一个很反直觉的现象:真正卡人的往往不是标着 Hard 的难题,而是那些看起来只有 Medium,但数据范围和边界条件设计得非常刁钻的题目。这段时间我帮不少候选人复盘过在线笔试记录,发现高频题型的分布其实非常集中,数组哈希、滑动窗口、区间合并、网格图 DFS/BFS 这几类占了绝大多数。这篇文章就把这些高频考点的完整思路、可运行代码和变体扩展整理出来,适合正在准备 TikTok 算法笔试、尤其是时间紧想按优先级刷题的人参考。文章不会去赌某一场的具体考题,而是把这段周期内出现频率最高的题型和考法拆开讲透,让你拿到新题也能快速套上正确的解法框架。
1. 先说清楚:TikTok OA 到底考什么、怎么判分
1.1 题目构成与时间限制
TikTok 的 OA 一般控制在 70 到 90 分钟,题目数量在 2 到 4 道之间。常见组合是两道 Medium 加一道 Hard,偶尔会出现一道 Easy 热身题。这里的 Medium 和 Hard 是相对 LeetCode 难度而言的,但 OA 里的 Medium 通常比 LeetCode 上同标签的题要稍微绕一点,主要绕在两点:一是题目描述会包裹一层业务场景,比如推荐列表去重、视频标签合并、用户关注关系统计;二是输入输出格式不按 LeetCode 的标准函数签名给,需要你自己处理标准输入。
时间分配上,我的建议是每道题先花 2 到 3 分钟读题,想清楚数据范围再动手。很多人挂在第二道题上,就是因为第一道题写完觉得稳了,第二道题就开始着急,结果读题不仔细,把“至少 k 个不同字符”看成了“恰好 k 个”。OA 没有面试官在旁边提醒你,读错一个条件可能整道题全错。
1.2 判分逻辑:全部测试用例通过才算满分
OA 的判分不是只看最后答案对不对,而是按测试用例给分。平台会跑一组不可见的测试用例,你通过的用例数占总用例数的比例就是你的得分比例。也就是说,如果你写了暴力解法,在小数据用例上能过一部分,也能拿到一点分,但如果你想要通过简历筛选,必须尽量把隐藏的大数据用例也过掉。
这意味着两个关键点:第一,复杂度的优化直接决定你能拿多少分,O(n^2) 的代码如果遇到 n = 10^5 的用例,基本就是超时零分;第二,边界情况必须覆盖清楚,空输入、单元素、重复元素、负数、超大值这些用例往往就是拉开差距的地方。我见过很多候选人思路完全正确,但因为数组越界或者没处理空数组,导致 3 个用例失败,最后只拿了 70% 的分数。
1.3 环境与输入输出要求:函数签名还是标准输入
不同的 OA 平台要求不一样,有的给你一个函数签名让你补全,有的直接要求你从标准输入读取并打印结果。TikTok 的 OA 两种形式都出现过,但近几年更偏向标准输入输出。这里给一个 Python 的输入模板,可以应付绝大多数情况:
python复制import sys
def main():
data = sys.stdin.read().strip().split()
if not data:
return
# 假设第一行是 n 和一个 target
n = int(data[0])
target = int(data[1])
nums = list(map(int, data[2:2 + n]))
# 你的算法逻辑
result = your_function(nums, target)
print(result)
if __name__ == "__main__":
main()
这个模板的好处是避免用 input() 逐行读可能出现的读不到数据或读超时问题。如果 OA 给了函数签名,那就直接用函数签名,不用管输入输出。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高频题型分布:按出现频率排出刷题优先级
2.1 近几轮考情观察:各题型大致占比
我把最近这段周期内出现过的 OA 题目按考点归了个类,得到一个粗略的占比分布。要说明的是,这不是官方的统计,只是基于我看到的题目和候选人反馈做的经验性归纳,但用来做刷题优先级参考是够的。
| 考点方向 | 大致占比 | 典型难度 |
|---|---|---|
| 数组与哈希表 | 25% | Medium |
| 滑动窗口与双指针 | 20% | Medium |
| 区间合并与贪心 | 15% | Medium |
| 网格图 DFS/BFS | 15% | Medium |
| 二分查找与堆 | 15% | Medium 到 Hard |
| 其他(动态规划、栈) | 10% | Hard |
看出规律了吗?数组哈希、滑动窗口、区间、网格图这四类加起来占了大约 75%。这意味着你不需要把 LeetCode 上所有 Hard 题都刷一遍,只要把这四个方向练熟,OA 的基本盘就稳了。
2.2 为什么这几个方向是重点
从出题者的角度看,这几个方向最容易设计出区分度高的题目。它们有明确的数学结构,能保证答案唯一,而且可以用不大不小的数据范围(比如 n = 10^5)来卡掉暴力解法。更重要的是,这些数据结构在真实业务场景里都有直接对应:哈希表对应推荐系统的去重和快速查询,滑动窗口对应时间窗口内的统计分析,区间合并对应内容排期和标签聚合,网格图对应社交关系或内容传播路径的建模。所以它们不只是在 OA 里高频,在实际工程面试里也经常出现。
有候选人问我要不要花大量时间刷动态规划。我的看法是:动态规划确实会考,但频率和难度都更适合在基础扎实之后再去突破。如果你的目标是短期内通过 OA 筛选,优先把上面四类做到“闭着眼能写”的程度,收益比最高。DP 只需要掌握最经典的背包、打家劫舍、最长递增子序列这类题,再结合题目条件判断是否需要状态压缩就够了。
3. 第一类必考:数组与哈希表,两数之和变体精讲
3.1 题目原型:输出所有不重复的数字对
先看一道非常典型的变体题,它在几轮 OA 里反复出现,考的是哈希表在数组问题里的灵活运用。
题目描述:给定一个无序整数数组 nums 和一个目标值 target,请找出所有和等于 target 的不重复数字对。数字对中的两个数按升序排列,所有数字对再按第一关键字升序排列。数组中如果有重复数字,同一个数字对只输出一次。
示例输入:
code复制nums = [1, 4, 2, 3, 0, 5], target = 5
示例输出:
code复制(0, 5), (1, 4), (2, 3)
注意:[1, 4] 和 [4, 1] 算同一个数字对;如果数组是 [2, 2, 3, 3],也只输出一个 (2, 3)。
