在激烈的科技求职市场,TikTok 的招聘备受关注。作为全球短视频社交平台,它用创新和高速增长吸引了无数求职者,而 OA 往往是能否进入面试、靠近 offer 的关键一步。这篇把三道高频业务场景真题完整拆解——题目都不偏,但每道都藏着容易翻车的边界。
一、三题概览
| 题号 | 场景 | 考点 |
|---|---|---|
| Q1 | 最高平均点赞用户 | 除零处理 + 同分取最小 ID |
| Q2 | 兴趣标签去重排序 | 字符串拆分 + set + 字典序 |
| Q3 | 最大并发直播数 | 扫描线 / 差分 |
二、Question 1:最高平均点赞用户
题目
给定二维数组 user_data,每个元素是 [用户ID, 视频数, 总点赞]。求平均点赞最高的用户 ID(平均 = 总点赞 / 视频数;若视频数为 0,平均视为 0)。若多个用户同为最高,返回最小的用户 ID。
示例:[[1, 5, 100], [2, 3, 75], [3, 0, 0]] → 输出 2(平均分别 20 / 25 / 0)。
思路
直接遍历,注意两个坑:除零(视频数 0 时平均算 0,别真除)和同分取最小 ID。为避免浮点误差,比较时用交叉相乘而非除法:
def highest_avg_likes(user_data: list[list[int]]) -> int:
best_id = -1
best_num, best_den = -1, 1 # 用分数 best_num/best_den 表示当前最高平均
for uid, videos, likes in user_data:
num, den = (likes, videos) if videos > 0 else (0, 1) # 除零 -> 平均 0
# 比较 num/den 与 best_num/best_den:交叉相乘避免浮点
if num * best_den > best_num * den or \
(num * best_den == best_num * den and (best_id == -1 or uid < best_id)):
best_num, best_den, best_id = num, den, uid
return best_id
复杂度 O(n)。交叉相乘是关键技巧,能完全避开浮点比较的精度问题。
三、Question 2:兴趣标签去重排序
题目
一个字符串表示用户的兴趣标签集合,标签用逗号分隔(如 "Food,Travel,Music")。实现一个函数,去重后按字典序排序,返回新的标签字符串。
示例:"Music,Food,Travel,Music" → "Food,Travel,Music"。
思路
拆分 → set 去重 → 排序 → 拼接,一行能写完,但要注意空串和首尾 / 多余逗号等边界:
def normalize_tags(tags: str) -> str:
parts = [t for t in tags.split(",") if t] # 过滤空串,处理多余逗号
return ",".join(sorted(set(parts)))
复杂度 O(k log k),k 为标签数。陷阱:"a,,b," 这种带空段的输入,if t 过滤掉空串才不会排出空标签。
四、Question 3:最大并发直播数
题目
一系列直播时段,每个用 [开始, 结束](整数分钟)表示,存在二维数组 live_streams 中。求同时进行的最大直播数。
示例:[[10, 20], [15, 25], [20, 30]] → 输出 2(15–20 分钟内有两场重叠)。
思路
经典扫描线 / 差分:把每个区间拆成「开始 +1」「结束 -1」两个事件,按时间排序后扫描,维护当前并发数取最大。注意端点处理——若直播在结束时刻 t 仍算「进行中」,则结束事件应在同刻开始事件之后处理(这里按「左闭右开」语义,结束即离开):
def max_concurrent(live_streams: list[list[int]]) -> int:
events = []
for start, end in live_streams:
events.append((start, 1)) # 开始:+1
events.append((end, -1)) # 结束:-1
# 同一时刻先处理结束(-1)再处理开始(+1):左闭右开,结束即离开
events.sort(key=lambda e: (e[0], e[1]))
cur = best = 0
for _, delta in events:
cur += delta
best = max(best, cur)
return best
复杂度 O(n log n)。陷阱:同刻事件顺序决定了边界语义——若题目认为「20 结束」和「20 开始」算重叠,则要先处理 +1。务必先和题面 / 样例对齐再定排序 key。
五、总结
TikTok OA 这三道都是业务包装的基础题:Q1 考除零 + 同分 tiebreak(交叉相乘避浮点),Q2 考字符串清洗的边界(空段过滤),Q3 考扫描线的同刻事件顺序。题不难,但小错最致命——准确率和边界处理才是 AC 的关键。
FAQ
Q1:TikTok OA 这三题难吗?
不难,都是业务包装的基础题。真正的考点是边界:除零、同分取最小 ID、空标签段、扫描线同刻事件顺序。小错最容易丢分。
Q2:平均点赞为什么用交叉相乘?
避免浮点精度问题。比较 a/b 与 c/d 时用 ad 与 cb 比较,全程整数运算,既准确又快,同分时再按最小 ID tiebreak。
Q3:最大并发直播怎么处理端点?
扫描线 / 差分:开始 +1、结束 -1,按时间排序后扫描取最大。关键是同刻事件顺序——左闭右开就先处理结束,若结束时刻算重叠就先处理开始。先用样例对齐语义。
Q4:怎么准备 TikTok OA?
练业务题的边界意识(除零、空输入、端点语义)和扫描线 / 哈希 / 排序基础。如需这三题的限时陪练,可发岗位 JD 先做题型预测再排练习计划。
正在准备 TikTok OA?
TikTok OA 多是业务包装的基础题,考准确率 + 边界处理。oavoservice 提供 TikTok 全流程陪练:业务题限时模拟、扫描线 / 字符串 / 哈希题边界打磨、OA 节奏演练,按岗位线定制题型预测。教练熟悉 TikTok OA 评分逻辑。
立即添加微信 Coding0201,获取 TikTok 真题与陪练。
联系方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy