‹ 全部面经
TikTok OA 经典四道题:相邻字符计数、最近时间戳、图形摆放、等差数列最少操作
TikTok OA 四题思路:忽略大小写统计相邻不同字符、找小于当前时间的最近时间戳、ABCDE 图形按行列优先摆放模拟、只能 +1 把数组变成公差 ±1 的最少操作数。
OA
这几天做的一场 TikTok OA。他家出的题都很熟悉,基本都能很快做完。
T1:忽略大小写统计相邻不同字符
统计在忽略大小写的情况下 s[i] != s[i + 1] 的数量。按题意顺序遍历一遍,把每个字母都转成小写再判断即可。
def count_case_insensitive_changes(s):
t = s.lower()
return sum(1 for x, y in zip(t, t[1:]) if x != y)
T2:小于当前时间的最近时间戳
给一个当前时间 cur,以及一个按时间递增的时间戳序列,找出距离 cur 最近、且 < cur 的时间戳。按题目格式把时间转换成数字(比如分钟数),剩下的就很简单了。序列有序,可以直接二分。
from bisect import bisect_left
def to_minutes(t): # "HH:MM" -> 分钟数
h, m = t.split(":")
return int(h) * 60 + int(m)
def latest_before(cur, stamps):
i = bisect_left([to_minutes(t) for t in stamps], to_minutes(cur)) - 1
return stamps[i] if i >= 0 else None
T3:ABCDE 图形摆放
给你 A、B、C、D、E 五种图形,按「行优先、再列优先」的顺序尝试摆放,看能不能放得下。
思路:先用一个 map 存好每种图形所占格子的相对坐标(以左上角的格子为 (0, 0)),然后每次摆放时用 for x in range(n): for y in range(m):,以每个 (x, y) 为起点尝试摆放,第一个放得下的位置就是答案。
T4:把数组变成公差为 ±1 的数组,最少操作数
只能做 +1 操作,问把数组变成公差为 1 或 −1 的等差数列的最少操作数。
思路:分公差 d = 1 和 d = −1 两种情况。目标数组是 start + d·i,因为只能加,所以要满足 start + d·i ≥ a[i],也就是 start = max(a[i] − d·i)。两种情况分别求出首项,再分别算差值总和,取较小的那个。
def min_ops_unit_progression(a):
best = None
for d in (1, -1):
start = max((x - d * i for i, x in enumerate(a)), default=0)
ops = sum(start + d * i - x for i, x in enumerate(a))
best = ops if best is None else min(best, ops)
return best