在激烈的科技求職市場,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