作為專注於求職助攻的專業團隊,programhelp 近期跟蹤了多場 TikTok 校招及社招 OA 筆試,發現其考試形式已發生重大調整:平臺從原有的 HackerRank 全面遷移至 Codesignal,題型也從「5 選擇 + 2 程式設計」改為「70 分鐘 4 道純程式設計題」。目前一畝三分地等平臺鮮有最新原題分享,我們結合近期實戰經驗,整理了完整的真題解析、AC 解法及針對性輔導方案,助力求職者高效通關。
核心考试信息梳理
- 考試平臺:僅 Codesignal 網頁端,支援本地 IDE 編寫後貼上提交,提供程式碼高亮與執行除錯功能;
- 題型規則:4 道純程式設計題,無選擇題,70 分鐘作答時間,時間充裕,中等速度完成後仍有充足查錯時間;
- 題庫來源:不使用 TikTok 自研題庫,均抽取 Codesignal 平臺原生題目,無重複舊題,側重考察硬實力;
- 通过标准:题目难度整体为中等,无高难度 Hard 题,4 道题全部 AC(100% 通过率)是获取面试邀约的关键,仅通过 2-3 道则通过率大幅下降;
- 考點分佈:集中於陣列字串處理、模擬邏輯、雜湊表應用,無複雜 DP 或圖論題目,屬於透過系統訓練即可攻克的型別。
真題一:數字碎片拼接統計(高頻必考)
題目描述
給定正整數陣列 fragments(數字碎片)和目標數字 accessCode,統計滿足條件的有序下標對 (i, j)(i≠j)的數量,要求 str (fragments [i]) + str (fragments [j]) == str (accessCode)。
解題思路
本題最優解法為字串處理結合雜湊表,時間複雜度 O (n),避免暴力列舉導致超時:
- 型別轉換:將 accessCode 轉為字串 s,陣列中所有數字碎片均轉為字串形式;
- 頻次統計:利用 Counter 統計所有字串碎片的出現次數,便於快速查詢;
- 字首匹配:遍歷每個字串片段 a,判斷 s 是否以 a 為字首,若滿足則計算字尾 b = s [len (a):];
- 組合數計算:若 b 存在於統計結果中,分兩種情況計算:a≠b 時,組合數為 a 的頻次 ×b 的頻次;a==b 時,需滿足 i≠j,組合數為 a 的頻次 ×(a 的頻次 – 1);
- 結果累加:彙總所有符合條件的組合數,即為最終答案。
AC 滿分程式碼(Python,Codesignal 直接提交)
python
執行
from collections import Counter
def solution(fragments, accessCode):
s = str(accessCode)
str_frags = [str(num) for num in fragments]
cnt = Counter(str_frags)
res = 0
for a in cnt:
if s.startswith(a):
b = s[len(a):]
if b in cnt:
if a != b:
res += cnt[a] * cnt[b]
else:
res += cnt[a] * (cnt[a] - 1)
return res
易錯點提醒
- 注意有序對要求,解法天然覆蓋 i 和 j 的順序差異,無需額外處理;
- 必須透過字串拼接判斷,不可直接進行數字運算,避免位數進位導致錯誤;
- 重點關注 a==b 的場景,遺漏 “頻次 – 1” 會導致答案偏小。
真題二:報紙排版(文字對齊 + 邊框模擬)
題目描述
給定單詞陣列、頁面寬度 width、對齊方式 alignment(left/right),按以下規則完成排版並返回完整頁面:
- 排版規則:按順序裝載單詞,單詞間至少保留 1 個空格,若加入下一個單詞會超寬則換行;
- 對齊規則:每行內容補齊空格至 width 長度,左對齊補尾部,右對齊補開頭;
- 邊框規則:每行首尾加豎線 |,頁面最上方和最下方加寬度為 width+2 的橫線 -。補充約束:單個單詞長度不超過 width,無排版困難。
解題思路
本題為純模擬題,核心在於邏輯拆解與細節處理,步驟如下:
- 分行處理:遍歷單詞,累計當前行單詞長度及所需空格數,判斷是否可加入下一個單詞,不可則處理當前行並換行;
- 對齊補齊:對每行單詞拼接後,計算所需補充空格數,按對齊方式完成空格填充;
- 邊框新增:為每行內容首尾加 |,生成上下橫線邊框,組合為最終頁面。
AC 滿分程式碼(Python,Codesignal 直接提交)
python
執行
def solution(words, width, alignment):
lines = []
current_line = []
for word in words:
current_len = sum(len(w) for w in current_line) + len(current_line) - 1 + len(word) if current_line else len(word)
if current_len <= width:
current_line.append(word)
else:
lines.append(' '.join(current_line))
current_line = [word]
if current_line:
lines.append(' '.join(current_line))
border_lines = []
for line in lines:
space_need = width - len(line)
if alignment == 'left':
aligned = line + ' ' * space_need
else:
aligned = ' ' * space_need + line
border_lines.append(f'|{aligned}|')
top_bottom_border = '-' * (width + 2)
final = [top_bottom_border] + border_lines + [top_bottom_border]
return '\n'.join(final)
易錯點提醒
- 分行計算時需包含單詞間的空格,否則會導致換行判斷錯誤;
- 空格補充需精確到 width 長度,避免邊框錯位;
- 遍歷結束後需處理最後一行未存入的單詞。
高頻補充真題
第一題:找所有 t[i] > t[i – 1] && t[i] > t[i + 1] 的數,然後返回這個陣列就行了,按題意模擬一遍
第二題:維護每個位置放了多少種不同的物品,返回物品數量最多的位置,需要用 map 套 set 來維護位置並且給物品去重,最後遍歷我們的 map 還有 set 的 size 大小就行了,記錄最大值
第三題:我們以每個 1 為起始點,按題目意思模擬,向左上右上左下右下拓展就行了,對應的每次 x y 座標的增量向量就是 (1, 1) (1, -1) (-1, -1), (-1, 1) 這四種,跑一遍就行了,注意只有走到邊界才計入答案當中
第四題:維護每個點被多少個 2 * 2 的矩陣覆蓋,如果建一個 n * m 的矩陣然後模擬肯定不行,因為 n m 大小的規模都是 1e5 的,但是由於每個點最多被覆蓋 4 次,並且 2 *2 矩陣的數量是有限的,我們直接用 map 來維護,維護每個點的狀態,這裡的話懶得再寫個 pair 插到 map 裡了,就直接寫個狀壓得了,由於 (x, y) 都是不超過 int 範圍的,所以我們可以用 x << 32 再或上 y 來得到這個點的狀態,然後在 map 裡對應點的計數++就好了,最後 0 的數量用總的算算就行
高效通關 TikTok OA?Programhelp 幫你一把!
面對 TikTok 校招/社招 OA,單靠刷題往往效率低、容易遺漏細節。Programhelp 提供 遠端無痕 OA 代寫與線上輔導服務,覆蓋 HackerRank、牛客網、Codesignal 等主流平臺。
- OA 代寫:保證所有測試用例 100% 透過,不透過不收費;
- AC 解法輔導:Python、Java、C++ 等語言均可,精準講解每題核心邏輯與易錯點;
- 遠端無痕操作:完全安全,不影響賬號使用;
- 個性化訓練:針對你的弱項定製刷題計劃,快速提升通關效率。
不再孤軍奮戰,Programhelp 讓你高效通關 TikTok OA,輕鬆邁向面試 Offer。