题目重点:核对两篇 Netflix Coding 面经中最长连续相同 show 题,使用一次扫描维护当前段,说明空输入、相等语义和与最长无重复子数组的区别。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 输入按播放顺序排列,show ID 可比较相等;只有相邻且相同才能延长当前段。
- 空输入返回 0;若要返回起止位置,遇到严格更长的段时同步保存。
- 题目使用 int/string 作为 show 标识,两者可用同一相等比较算法,前提是 ID 已规范化。
解题路线
- 从左到右维护 previous 与 current_length:与前项相同则 +1,否则重置为 1;每步更新 best。
- 循环开始用独立 sentinel 避免真实 show 值与初始化值碰撞;每段被访问一次。
- 相比题目候选人的 left/right+while 写法,本题只要相邻比较,不需要滑动窗口或回退;若追问返回所有并列最长段,可在每次达到/超过 best 时维护结果列表。
手动走一遍
[A,A,B,B,B,A] 的连续段长度依次为 2、3、1,因此返回 3;最后的 A 与开头两项不相邻,不能合并。空列表返回 0,单项返回 1。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def longest_equal_streak(shows):
best = 0
current = 0
previous = object()
for show in shows:
current = current + 1 if show == previous else 1
best = max(best, current)
previous = show
return best
复杂度
n 个 show 一次扫描 O(n),只保存前项、当前长度和最优值,额外空间 O(1)。若输出所有最长段,结果本身可能 O(n)。
易错点与追问
容易失分的边界
- 统计每个 show 在全数组出现次数,而不是连续段。
- 把最长连续无重复题的 set/window 解法套进来,解决了相反约束。
- 重置当前长度时漏计新段首项。
- 初始化 previous 为可能真实出现的 show ID。
继续深挖
- 流式输入如何随时报告当前最优长度?
- 要求返回最早/最晚最长段的索引时平局如何定义?
- 如果相邻的同一剧集不同 episode 算同一 show,规范化应在哪一层做?
