作为专注于求职助攻的专业团队,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。