
這場 TikTok CodeSignal Backend OA 的整體難度不高,但四題都很典型:前兩題偏熱身,第三題是純模擬,第四題考數字字串前綴和集合查詢。
真正需要注意的不是複雜演算法,而是能不能把題面規則穩穩翻譯成可維護的狀態。尤其第三題的記憶體分配,如果一開始就想寫得很「系統」,反而容易把簡單模擬寫亂。
這篇不放程式碼,只按實戰做題順序講清每題怎麼想、哪裡容易錯。
考試概況
| 項目 | 詳情 |
|---|---|
| 平台 | CodeSignal |
| 公司 | TikTok |
| 方向 | Backend / SWE |
| 題數 | 4 題 |
| 題型 | 區間判斷、陣列模擬、記憶體分配模擬、數字前綴 HashSet |
| 整體難度 | Easy 到 Medium |
Q1:Rating 最終等級判斷

題目在問什麼
給一個初始 rating,再給一組 rating changes。把所有變化累加到初始值上,得到最終 rating,然後按區間返回等級:
- 小於 1000 是 beginner
- 1000 到 1499 是 intermediate
- 1500 到 1999 是 advanced
- 2000 及以上是 pro
題目保證中間和最終 rating 都不會超出給定範圍,所以不需要處理非法 rating。
做題入口
這題本質就是一次求和加區間判斷。先把最終值算出來,再按邊界從高到低或從低到高判斷都可以。
這裡沒有隱藏優化點,也不需要前綴和。CodeSignal 說不需要最優解,但這題最自然的解法本身就是線性的。
容易錯的點
- 1000、1500、2000 這些邊界都是左閉的
- 999 和 1000 不在同一個等級
- 不要在每一步變化後返回等級,題目要的是最終 rating 的等級
這題應該快速拿下,不要在這裡消耗太多時間。
Q2:從最左非零數開始的陣列削減模擬

題目在問什麼
給一個非負整數陣列。每一輪先找到最左邊的非零元素,把它的值記作 x。然後從這個位置開始向右走,盡量給後面的元素都減去 x。
如果遇到某個元素嚴格小於 x,這一輪就停止。無論這一輪減到哪裡,都把 x 加到答案裡,然後回到下一輪,繼續找最左非零元素。
直到陣列裡沒有非零數,返回累計答案。
做題入口
最直接的暴力模擬就夠了:
- 每輪從左到右找第一個非零數
- 記錄這輪要減掉的值
- 從該位置往右逐個嘗試扣減
- 遇到不夠減的位置就停
- 把這輪的值計入答案
題目本身也提示了不需要特別極限的複雜度,所以不用強行推數學公式。
為什麼暴力思路很穩
這題的關鍵在於「每一輪的起點由目前陣列狀態決定」,不是固定視窗,也不是一次掃描就能完全解決的題。只要按題意維護過程,狀態變化就是清楚的。
對 OA 來說,這類題最怕想過度:越想用單調棧、差分、區間結構,越容易偏離題目要求。除非資料範圍特別大,否則按規則模擬是最穩的。
容易錯的點
- 每一輪的
x是最左非零元素的目前值,不是原陣列裡的值 - 向右扣減時,遇到嚴格小於
x才停;等於x可以扣到 0 - 答案加的是這一輪的
x,不是這一輪扣掉的元素個數 - 一輪結束後必須重新從左邊找非零數
Q3:8 對齊的 Memory Allocator

題目在問什麼
給一個由 0 和 1 組成的 memory 陣列。0 表示空閒,1 表示佔用。記憶體區塊必須從下標能被 8 整除的位置開始,也就是 0、8、16 這些位置。
有兩類 query:
alloc x:找最靠左、起點 8 對齊、長度為 x 的連續空閒區間,找到就佔用並分配一個新的 ID,返回起點;找不到返回 -1erase ID:如果這個 ID 對應的區塊還存在,就釋放整塊並返回釋放長度;如果不存在或已經刪過,返回 -1
每次成功 alloc 都會產生一個新的遞增 ID。erase 用的就是這個 ID。
做題入口
這題不用寫真正的 malloc,也不需要複雜資料結構。按題面暴力維護即可:
對 alloc x:
- 只枚舉 8 的倍數作為候選起點
- 對每個起點檢查後面 x 個位置是否全是空閒
- 第一個能放下的位置就是答案
- 放下後,把這段 memory 標成佔用,並記錄這次分配的 ID 和區間資訊
對 erase ID:
- 先看這個 ID 是否仍然有效
- 有效就把對應區間恢復成 0,並返回長度
- 無效就返回 -1
如果不用額外映射,也可以按題目允許的方式掃陣列找匹配 ID。但更穩的表達是:同時維護「memory 是否佔用」和「ID 對應區間」,erase 會更清楚。
這題的核心不是優化,而是狀態一致
第三題最容易出錯的地方,是 memory 裡只有 0/1,但 erase 需要知道某一段屬於哪個 ID。
所以做題時最好把狀態分開理解:
- memory 狀態:這個位置目前空不空
- allocation 狀態:某個 ID 對應哪段區間、是否還活著
只要這兩個狀態同步更新,題目就很機械。
容易錯的點
- alloc 的起點必須是 8 的倍數,不是任意空閒位置
x可以大於 8,所以一個區塊可能跨多個 8-unit segment- alloc 失敗時不能增加 ID
- erase 已經刪除過的 ID 要返回 -1
- erase 返回的是釋放區塊長度,不是起點,也不是 ID
- 初始 memory 裡可能已經有佔用位置,不能覆蓋
Q4:兩個陣列裡的最長共同數字前綴

題目在問什麼
給兩個整數陣列 firstArray 和 secondArray。數字前綴指的是從最高位開始截出來的一段數字,例如 123 是 12345 的前綴。
題目要找:從兩個不同陣列裡各選一個數字,它們之間最長的共同前綴長度是多少。如果完全沒有共同前綴,返回 0。
做題入口
最穩的做法是把數字當字串處理。
先遍歷 firstArray,把每個數字的所有前綴都放進一個 set。然後遍歷 secondArray,枚舉每個數字的所有前綴,只要這個前綴在 set 裡,就用它的長度更新答案。
這題不需要真的比較每一對數字。直接兩兩比較會變成陣列長度相乘,很容易沒必要地變慢。
為什麼 set 前綴足夠
題目只關心「有沒有某個 firstArray 的數字擁有這個前綴」,並不關心它來自哪個具體數字。
所以把所有 firstArray 前綴統一放進 set 後,secondArray 的任意前綴只要命中,就說明存在一對數字共享這個前綴。
答案就是命中的最長長度。
容易錯的點
- 前綴按數字的十進位表示從最高位開始,不是陣列前綴
- 共同前綴可以是整個數字本身
- 不要把數字前綴理解成數值範圍,轉字串更直觀
- 如果沒有任何共同前綴,返回 0
- 題目問的是長度,不是前綴數字本身
這套題怎麼分配時間
| 題目 | 建議策略 |
|---|---|
| Q1 | 直接求和判斷,盡快完成 |
| Q2 | 按題意暴力模擬,別過度優化 |
| Q3 | 先把 alloc / erase 的狀態定義清楚,再寫模擬 |
| Q4 | 用 set 存 firstArray 的所有數字前綴,再掃 secondArray |
整體看,這套 TikTok Backend OA 更像是在考「能不能把規則翻譯成穩定實作」,而不是在考高級演算法模板。Q1 和 Q2 應該快速通過,Q3 重點保證 ID、區間、8 對齊都不亂,Q4 用 HashSet 降掉不必要的兩兩比較。
oavoservice 提醒
TikTok / ByteDance 的 CodeSignal OA 經常會把簡單題和模擬題包裝成長題面。真正做的時候,先不要急著寫複雜結構,把輸入、狀態、返回值逐項翻譯清楚,往往比套模板更重要。
如果你正在準備 TikTok Backend OA,可以重點練這幾類題:
- 區間邊界判斷
- 按題意模擬
- 記憶體或資源分配類狀態維護
- 字串化數字處理
- HashSet / HashMap 快速查詢
這些題不一定難,但非常考臨場穩定度。
TikTok OA 2026 備考交流與後續建議
如果你正在準備 TikTok / ByteDance SDE / Intern / New Grad 2026 OA,歡迎私訊交流:
- 想看某一題的 Python / Java 完整解法與拆解
- 需要更多同類變體題或 Debug 模板
- 想先了解 TikTok 後續面試(Behavioral / BQ / System Design)常見追問
- 想了解 Programhelp 長期使用的 OA 實戰支援方式(包含更重視隱私與風險控管的輔助流程)
祝大家 2026 TikTok OA 順利通過,早日拿到理想 Offer。保持穩定輸出,持續衝刺。
需要面試真題? 立刻聯繫微信 Coding0201,獲得真題。
聯繫方式
Email: [email protected]
Telegram: @OAVOProxy