← 返回部落格列表 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 真題與陪練

聯絡方式