Tiktok OA 26 1月份换新题了,还是熟悉的套路,非常简单四个题30min内就AC了,基本都是一次过,都是在codesignal出题 70min4题,不依赖自己公司的题库,而是依赖codesignal平台,题目难度的话前两题是easy,然后一道medium,一道hard,分享一套最近刚做的Tiktok OA真题,在一亩三分地上也有很多参考的题目,可以提前熟悉下。
Tiktok OA
Question 1
要求你实现一个图书馆图书流转追踪器:给定一串按顺序执行的操作,模拟图书库存的变化,并在每次 checkout(借书) 时计算被借出图书的保险价值总和。操作分为三类:acquisition(按类别和价格入库若干本书)、checkout(从指定类别中借出若干本书,若同类书存在不同价格,需优先借出价格最低的书,且保证库存充足)、reclassify(将某一类别中指定数量、指定原价的书升级为更高的新价格)。最终需要返回一个数组,按顺序记录每一次 checkout 操作对应的借出书籍总价值。
思路
- 按“分类”分别维护一个“价格→数量”的计数表和该分类价格的最小堆。
- acquisition:把价格 p 的数量加 q,并把 p 压入堆。
- reclassify:把 q 本从价格 from 转到价格 to(减少 from、增加 to),堆采用懒删除,计数为 0 的价格在取堆顶时再清理。
- checkout:反复取堆顶的最便宜价格,按需拿书并累计保险金额直到满足请求
代码
from heapq import heappush, heappop
def solution(operations):
cats = {}
ans = []
for op in operations:
t, c = op[0], op[1]
if c not in cats:
cats[c] = [[], {}]
hp, cnt = cats[c]
if t == "acquisition":
q, p = int(op[2]), int(op[3])
cnt[p] = cnt.get(p, 0) + q
heappush(hp, p)
elif t == "reclassify":
q, a, b = int(op[2]), int(op[3]), int(op[4])
cnt[a] = cnt.get(a, 0) - q
cnt[b] = cnt.get(b, 0) + q
heappush(hp, b)
else:
q = int(op[2])
s = 0
while q > 0:
while hp and cnt.get(hp[0], 0) == 0:
heappop(hp)
p = hp[0]
take = min(q, cnt[p])
s += take * p
cnt[p] -= take
q -= take
if cnt[p] == 0:
heappop(hp)
ans.append(s)
return ans
Question 2
一个虚构星球 Octavia 的时间计算问题:一年被分为与地球相同天数的 12 个季节(月),但时间不是用星期而是用 8 种循环的月相(NewMoon → Crescent → Quarter → Gibbous → Full → Waning → Eclipse → Twilight)来表示。已知1 月 1 日的初始月相、目标日期所在的季节(月)和该月中的第几天,要求你从年初开始累计天数,根据“每天月相顺序前进 1 位、8 天一个完整循环”的规则,计算并返回目标日期对应的月相。
思路
- 先按顺序列出12个月的天数与8个相位。
- 用前缀和构造
pref[month],表示从年初到该月 1 日之前累计的天数。 - 计算目标日期在年内的序号
k = pref[season] + dayCount - 1(从0开始)。 - 初始相位的下标加上
k后对 8 取模,即为该日期的相位下标并返回对应名称
代码
from itertools import accumulate
def solution(season, dayCount, initialPhase):
months = ["January","February","March","April","May","June",
"July","August","September","October","November","December"]
days = [31,28,31,30,31,30,31,31,30,31,30,31]
phases = ["NewMoon","Crescent","Quarter","Gibbous","Full","Waning","Eclipse","Twilight"]
pref = dict(zip(months, [0] + list(accumulate(days))[:-1]))
k = pref[season] + (dayCount - 1)
idx = (phases.index(initialPhase) + k) % 8
return phases[idx]Question 3
这道题给你一个二维整数矩阵 matrix 表示仓库货物网格,以及一串字符串指令 commands,要求你按顺序对矩阵执行对应的变换并返回最终矩阵:指令包含 交换两行(swapRows r1 r2)、交换两列(swapColumns c1 c2)、反转某一行(reverseRow r)、反转某一列(reverseColumn c)、以及 整矩阵顺时针旋转 90°(rotate90Clockwise)。本质是实现这些矩阵操作的模拟器,逐条解析命令并就地更新矩阵即可
思路
- 逐条解析命令字符串,按首词派发到对应操作。
- 行/列交换用就地交换;行反转直接
list.reverse();列反转用双指针从上下对换。 - 旋转 90° 时新建
n×m矩阵并做坐标映射b[j][m-1-i] = a[i][j],更新当前矩阵。
代码
def solution(matrix, commands):
a = [row[:] for row in matrix]
for cmd in commands:
parts = cmd.split()
op = parts[0].lower()
if op == "swaprows":
r1, r2 = int(parts[1]), int(parts[2])
a[r1], a[r2] = a[r2], a[r1]
elif op == "swapcolumns":
c1, c2 = int(parts[1]), int(parts[2])
for i in range(len(a)):
a[i][c1], a[i][c2] = a[i][c2], a[i][c1]
elif op == "reverserow":
r = int(parts[1])
a[r].reverse()
elif op == "reversecolumn":
c = int(parts[1])
i, j = 0, len(a) - 1
while i < j:
a[i][c], a[j][c] = a[j][c], a[i][c]
i += 1
j -= 1
elif op == "rotate90clockwise":
m, n = len(a), len(a[0])
b = [[0] * m for _ in range(n)]
for i in range(m):
for j in range(n):
b[j][m - 1 - i] = a[i][j]
a = b
return aQuestion 4
给你一组照片 travelPhotos,每张照片用一对地标 ID 表示,含义是:这两个地标在旅行路线中是相邻连续被访问的(先后顺序不确定)。已知旅行者把所有地标都恰好访问一次,并且路线中每一对相邻地标都在照片集中出现,要求你根据这些“相邻关系”把整条旅行路线还原成一个地标访问顺序数组;输出可以是正向或反向(例如 [3,5,1,4,2] 或其逆序都算正确)。
思路
- 把每张照片当作无向边,建图并统计每个地标的度数。
- 由于整段旅程是一条简单路径,只有两个端点的度数为 1。
- 从任意端点出发,每次走向当前点里“尚未访问”的邻居即可把整条链串起来。
- 访问过的点放进
seen,直到收集到全部节点即为答案
代码
from collections import defaultdict
def solution(travelPhotos):
g = defaultdict(list)
for a, b in travelPhotos:
g[a].append(b)
g[b].append(a)
s = next(x for x, nbrs in g.items() if len(nbrs) == 1)
ans, seen = [s], {s}
while len(ans) < len(g):
u = ans[-1]
v = next(w for w in g[u] if w not in seen)
seen.add(v)
ans.append(v)
return ans我们长期稳定承接各大/科技公司如Amazon、TikTok、Google、Amazon等的OA笔试辅助服务,能够确保服务质量,test case能够全部通过。如有需求,请随时联系我们。