A "how to think" guide rather than a question dump. We don't list problem IDs — we walk through what to do the moment a fresh problem appears on screen. Every recall here comes from de-identified oavoservice student debriefs. Compliance notes on VO interview assist are at the end.
1. Platform and pacing
TikTok North America OA runs on CodeSignal Industry Coding: 4 questions, 70-minute hard cap, no per-question budget. The realistic time-allocation curve is:
[Q1] signature 10–15 min
[Q2] implementation 15–20 min
[Q3] medium 20–25 min
[Q4] harder remaining time
The pass mark sits around 600 / 800. Empirically: full Q1 + Q2 ≈ 350–400 points; partial Q3 ≈ 100–150; any Q4 hidden case is bonus. Don't grind Q4 — finish Q1–Q3 cleanly first.
2. Q1/Q2 themes: signatures and implementations
| Theme | Frequency | Approach |
|---|---|---|
| String frequency stats | very high | Counter + sort |
| Array prefix diff | high | prefix_sum |
| Simple simulation (vote / lottery) | mid | small state machine |
| Matrix rotation / mirror | mid | index mapping |
Recall: vote validity
Given vote events
votes[i] = (voter, candidate, t), only the last valid vote per voter counts (largestt). Return the candidate with the most votes; ties broken by lexicographic order.
def winner(votes):
last = {}
for voter, cand, t in votes:
if voter not in last or last[voter][1] < t:
last[voter] = (cand, t)
cnt = {}
for cand, _ in last.values():
cnt[cand] = cnt.get(cand, 0) + 1
return min(sorted(cnt.items(), key=lambda x: (-x[1], x[0])))[0]
Complexity: O(n log n). Trap: don't forget the lexicographic tiebreaker — it's the most common silent failure.
3. Q3 themes: prefix sum + binary search / two pointers
Recall: longest subarray with sum ≤ K (with negatives)
Given an integer array containing negatives and threshold K, find the longest contiguous subarray whose sum ≤ K.
import bisect
def longest_subarray_sum_le_k(nums, K):
n = len(nums)
prefix = [0] * (n + 1)
for i in range(n):
prefix[i + 1] = prefix[i] + nums[i]
sorted_prefix = []
best = 0
for j in range(n + 1):
target = prefix[j] - K
idx = bisect.bisect_left([p for p, _ in sorted_prefix], target)
if idx < len(sorted_prefix):
i = sorted_prefix[idx][1]
best = max(best, j - i)
while sorted_prefix and sorted_prefix[-1][0] >= prefix[j]:
sorted_prefix.pop()
sorted_prefix.append((prefix[j], j))
return best
Complexity: naive O(n²) times out; you must combine monotonic structure + binary search for full hidden-case AC.
4. Q4 themes: graph / DP
Recall: shortest path with color constraint
On an n×m grid, walk from (0,0) to (n-1, m-1). Each cell has a color c[i][j] ∈ 1..k. Adjacent cells on the path must have different colors. Return the shortest path length, or -1 if impossible.
from collections import deque
def shortest_color_path(grid):
n, m = len(grid), len(grid[0])
dist = [[-1] * m for _ in range(n)]
dist[0][0] = 0
q = deque([(0, 0)])
while q:
x, y = q.popleft()
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m and dist[nx][ny] == -1 and grid[nx][ny] != grid[x][y]:
dist[nx][ny] = dist[x][y] + 1
q.append((nx, ny))
return dist[n - 1][m - 1]
Complexity: O(n × m). Trap: identical start/end colors are still legal — only adjacent cells along the path must differ.
5. Score distribution and pass mark
22-sample OA distribution:
[700-800] █ 5%
[600-699] █████ 27%
[500-599] ████████ 41%
[400-499] █████ 22%
[<400] █ 5%
Median pass score is 600. Locking down Q1 + Q2 + main body of Q3 gets most candidates there. Q4 is the watershed: solving 1–2 hidden cases pushes you from 600 to 700+, which materially lifts callback probability.
6. Anti-cheat mechanics
| Mechanism | Trigger | How we handle it |
|---|---|---|
| Mandatory webcam | Switching cameras / leaving seat flags you | Device + room walkthrough |
| Screen share | 3 tab-switches → warning | Single-screen workflow + pre-staged material |
| Clipboard block | External paste blocked | Templates pre-staged inside the editor |
| In-editor copy | Allowed | Snippet shortcuts pre-rehearsed |
| Pacing analysis | Outlier submission cadence flagged | Cadence drilling in mock |
oavoservice offers a one-stop OA package — pattern prediction, timed mock, score diagnostics, and end-to-end VO interview assist — with mentor coverage from the moment the OA link arrives to submission.
7. 3-week prep schedule
| Week | Focus |
|---|---|
| W1 | CodeSignal timed mocks × 5 + zero-loss Q1/Q2 |
| W2 | Q3 theme drills: prefix sum, sliding window, graphs |
| W3 | Q4 high-frequency DP / graphs + full simulation |
FAQ
Is the OA always required?
For experienced, NG, and intern roles, almost always. Referral-only VO bypass exists but is rare.
Can I retake?
There is no built-in retake link. The cooldown is roughly 6 months; switching role family or BU can reset the pool sooner.
Can I use ChatGPT during the OA?
CodeSignal blocks external paste, requires camera + screen share, and flags pacing outliers. Browser-side GPT alone is high-risk. oavoservice offers a steadier path: live mentor assist + pattern prediction + cadence control.
How long until the next round?
Typically 1–2 weeks. Beyond 2 weeks, ping the recruiter politely.
How does VO interview assist plug into OA + VO?
oavoservice covers OA with pattern prediction, timed mocks, and live assist; VO with live thinking support, whiteboard review, and HM mocks. One package end to end.
Preparing for TikTok OA?
oavoservice has tracked TikTok OA themes for over two years. Services include pattern prediction, timed mocks, score diagnostics, and VO interview assist — end to end.
👉 Add WeChat: Coding0201, get the latest TikTok OA pack and VO assist plan.
Contact
Email: [email protected]
Telegram: @OAVOProxy