这次整理的是一道 TikTok Coding 面试真题。题目用了一个很生活化的场景:用户每天观看一集视频,系统要判断是否有两天看过编号足够接近的剧集。读起来不难,真正需要注意的是,时间差和剧集编号差必须同时满足,而且两个条件都是严格小于(<)。
Given an integer array v, where v[i] represents the episode watched on day i, and two integers k and t, determine whether there exist two different days i and j such that:
- Day difference: abs(i - j) < k
- Episode difference: abs(v[i] - v[j]) < t
Return True if both conditions are satisfied; otherwise, return False.
给定整数数组 v,其中 v[i] 表示第 i 天观看的剧集编号,再给定整数 k 和 t。
判断是否存在两个不同的日期,使日期间隔小于 k,且这两天观看的剧集编号之差的绝对值小于 t。存在就返回 True,否则返回 False。
举个便于理解的例子(非题面原有示例):
v = [2, 7, 9, 2],k = 4,t = 1
结果为 True。
第 0 天和第 3 天的间隔是 3,小于 4;两天观看的编号都是 2,差值为 0,也小于 1。
如果把 k 改成 3,结果就变成 False,因为日期差恰好等于 3,并不满足严格小于。
最直接的方法是枚举两天,逐对检查两个条件,时间复杂度为 O(n²)。这个思路很容易说清楚,但数组较大时没有必要检查所有历史日期。
关键在于 abs(i - j) < k。当我们遍历到第 i 天时,只需要和前面最多 k - 1 天比较。因此可以维护一个滑动窗口,窗口中保留仍然符合日期距离要求的剧集编号。
接下来要解决的是,怎样快速找到一个编号与 v[i] 的差值小于 t。
用有序集合维护窗口,每次查看与当前值最接近的已有元素,就可以避免逐个扫描。这个方案的时间复杂度是 O(n log k),空间复杂度是 O(min(n, k))。
如果进一步优化,也可以使用哈希分桶,在平均情况下做到 O(n) 时间;相邻桶仍然需要实际比较差值。
这题有几个很值得在 Mock Interview 中练熟的细节。首先,两个日期必须不同;其次,k <= 1 或 t <= 0 时不可能满足要求;另外,删除滑动窗口中过期数据时,距离恰好为 k 的日期已经不符合条件。代码里的 < 如果不小心写成 <=,很容易在边界测试中出错。
这道题的难点并不在写出多少行代码,而在于能否迅速把业务描述转换成滑动窗口问题,解释为什么只保留最近的记录,以及清楚说明复杂度和边界条件。
平时刷题时看懂一个解法,与在面试中把解法完整讲明白,还是两回事。
CSOAHELP 长期整理 TikTok、Google、Meta 等公司的真实技术面试题,也提供 Coding、System Design 相关的 Mock Interview 与面试准备辅导。
我们的训练会围绕读题、确认边界、优化思路和表达过程展开,让同学们在遇到这种看似简单、细节很多的题目时,更容易把自己的思考讲清楚。
正在准备 TikTok 或其他北美科技公司的技术面试,可以访问 CSOAHELP 了解真题资料与辅导服务。
我们也有代面试,面试辅助,OA代写等服务助您早日上岸~

