← 返回博客列表 TikTok OA 三道真题拆解:最高平均点赞用户 + 兴趣标签去重排序 + 最大并发直播数
TikTok

TikTok OA 三道真题拆解:最高平均点赞用户 + 兴趣标签去重排序 + 最大并发直播数

2026-06-09

在激烈的科技求职市场,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 真题与陪练

联系方式