Tiktok OA 一亩三分地 上基本没有看到最近分享出来的原题。Tiktok OA 目前已经从 HackerRank 迁移到了Codesignal 上,考察形式从之前5选择+2编程,变成了4编程,从Codesignal题库随机抽取4道题目,所以可能不会像之前在一个周期内是完全一样的题目。
最近做了挺多 tiktok oa ,都是在Codesignal出题 70min 4题 不依赖自己公司的题库,而是依赖Codesignal平台,题目难度整体中等,一般4题全部通过能够拿到面试几率大。
Tiktok OA 题一
题目:一组数字碎片 fragments(正整数数组),以及一个目标数字 accessCode。
你的任务是:统计有多少种不同的方式,可以从 fragments 中选取两个不同位置的碎片,按顺序拼接后,正好得到 accessCode。其实就是统计有多少个有序的下标对 (i, j)(i ≠ j),使得:str(fragments[i]) + str(fragments[j]) == str(accessCode)
解题思路
- 将
accessCode转成字符串s,并将所有fragments转成字符串后用Counter统计每个片段的出现次数。 - 枚举每个字符串片段
a,若s以a开头,则看b = s[len(a):]是否在cnt中。若存在,则可以用a + b = s。 - 统计组合数,若
a != b,组合方式为ca * cb,否则是ca * (ca - 1)(从不同位置选两个)
代码
from collections import Counter
def solution(fragments, accessCode):
s = str(accessCode)
cnt = Counter(map(str, fragments))
ans = 0
for a, ca in cnt.items():
if len(a) < len(s) and s.startswith(a):
b = s[len(a):]
cb = cnt.get(b, 0)
ans += ca * cb if a != b else ca * (ca - 1)
return ansTiktok OA 题二

题目:模拟报纸排版(文本对齐),将给定的多段文字按照指定规则排成一个“报纸页面”,并在页面外层加上边框。这道题是一个模拟规则题目,其实就是“文本换行 + 左右对齐 + 加边框”的字符串模拟题,考察细节处理能力。
解题思路
- 逐段遍历,把单词尽量装入当前行;一旦再加就超宽,就把当前行写入并开启新行。
- 行内容确定后,用空格补齐到
width长度;左对齐补尾部,右对齐补开头。 - 所有行生成后,在行首尾各加 ,并在最上、最下各加
width+2个 形成边框。 - 只线性遍历一次全部单词,时间复杂度 O(总字符数),空间复杂度 O(width)。
代码
def solution(paragraphs, aligns, width):
lines = []
for words, align in zip(paragraphs, aligns):
buf, length = [], 0
for w in words:
if buf and length + 1 + len(w) > width:
s = ' '.join(buf)
pad = ' ' * (width - len(s))
lines.append(s + pad if align == "LEFT" else pad + s)
buf, length = [], 0
length += (len(w) + (1 if buf else 0))
buf.append(w)
if buf:
s = ' '.join(buf)
pad = ' ' * (width - len(s))
lines.append(s + pad if align == "LEFT" else pad + s)
border = '*' * (width + 2)
return [border] + ['*' + l + '*' for l in lines] + [border]Tiktok OA 题三
题目:一个整数数组 numbers,数组中的每个数字都具有“魔法性质”。一个数字可以通过“最多交换两位数字(一次交换)”变成另一个数字,那么这两个数字就构成一个 合法的魔法配对,需要统计数组中有多少个不同的下标对 (i, j)(i < j),满足 numbers[i] 可以通过最多一次数字交换变成 numbers[j]。
解题思路
- 用
seen统计已出现数字次数;当前数先与自身(0 次交换)匹配:ans += seen[x]。 - 枚举当前数所有不同位的两两交换(至多一次交换),跳过会产生前导零的结果。
- 用
used去重,同一结果只统计一次,然后把seen中该结果的出现次数累加到答案。 - 处理完后把当前数计入
seen。
代码
from collections import Counter
def solution(numbers):
seen = Counter()
ans = 0
for x in numbers:
s = list(str(x))
m = len(s)
ans += seen[x]
used = set()
for i in range(m - 1):
for j in range(i + 1, m):
if s[i] == s[j]:
continue
s[i], s[j] = s[j], s[i]
if s[0] != '0':
y = int(''.join(s))
if y not in used:
ans += seen[y]
used.add(y)
s[i], s[j] = s[j], s[i]
seen[x] += 1
return ansTiktok OA 题四
题目:有一个整数数组 inventory,表示仓库中物品的类型编号。仓库会考察数组中的连续区间(子数组),需要统计有多少个连续子数组,包含至少 k 种不同且不重复的物品类型。
解题思路
- 外层循环固定子数组起点
i,内层循环枚举终点j,遍历所有可能的连续子数组。 cnt字典记录每个元素在当前子数组中的出现次数,uniq记录当前正好出现一次的元素个数。- 当某个元素第一次出现时
uniq+1,当它第二次出现时uniq-1,维持当前唯一元素数量。 - 如果
uniq >= k,则该子数组符合条件,计数器ans加一。
代码
def solution(inventory, k):
n, ans = len(inventory), 0
for i in range(n):
cnt = {}
uniq = 0
for j in range(i, n):
x = inventory[j]
c = cnt.get(x, 0)
if c == 0:
uniq += 1
elif c == 1:
uniq -= 1
cnt[x] = c + 1
if uniq >= k:
ans += 1
return ans了解更多
TikTok OA 一亩三分地 是地里分享最多的题目,做的最多的没什么难度,最近我们做的也是最多,基本都可以AC,VO面前会也会mock,全程跟进度 ,三大语言都没问题,另外北美各大小厂 OA/VO都没问题,上百场经验打底。
如果你近期也拿到Tiktok的OA,可以与我们联系交流,我们免费提供Tiktok OA 真题参考。