‹ 全部面经
27 TikTok CodeSignal OA:偶数位数、循环移位差值和、反弹对角线、区间最多点数
2027 TikTok CodeSignal OA 新题库四题思路:判断数字位数是否为偶数、两数组循环移位绝对差和、对角线反弹模拟、选中心使 2*lim 区间内点数最多(滑动窗口)。
OA
做完感觉比去年难度高一点,题库也是新的,分享一下个人思路。
第一题:数字位数是否为偶数
转成字符串,看长度能不能被 2 整除就行。
def has_even_digits(x):
return len(str(abs(x))) % 2 == 0
第二题:两个数组循环移位后的差值绝对值之和
双层循环:每移位一次,算一遍对应位置差的绝对值之和,把所有结果存起来,排序后返回。时间 O(n²)。
def shifted_abs_diff_sums(a, b):
n = len(a)
sums = [sum(abs(a[i] - b[(i + s) % n]) for i in range(n)) for s in range(n)]
return sorted(sums)
第三题:对角线行走,撞墙反弹
模拟沿对角线走,撞到墙就反弹。用集合记录走过的点,不要重复走。碰到角或者走到已经走过的点就停下,把路上的值加起来。
第四题:选一个中心,让区间内的点最多
选一个中心 c,统计 [c − lim, c + lim] 内最多能包含多少个点。
其实就是找长度不超过 2·lim 的区间最多能覆盖多少个点:先排序,再用滑动窗口扫一遍,记录最大点数和对应的中心位置。
def best_center(points, lim):
"""返回 (最多点数, 一个可行的中心)"""
pts = sorted(points)
best, center, left = 0, None, 0
for right, x in enumerate(pts):
while x - pts[left] > 2 * lim:
left += 1
if right - left + 1 > best:
best, center = right - left + 1, pts[left] + lim
return best, center
时间 O(n log n)。