SWE · CodeSignal OA

Capital One 前缀最长连续整数段:在线区间合并

OA 要每加入一个数字就返回当前已见集合最长的连续整数段长度;例 [2,3,0,4]→[1,2,2,3]。

题目重点:OA 要每加入一个数字就返回当前已见集合最长的连续整数段长度;例 [2,3,0,4]→[1,2,2,3]。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 连续指整数值相差 1,不要求它们在输入中相邻;输出每个前缀的最大连续整数段长度。
  • 重复 x 不增加集合,也不扩大区间;可有负数和 0。
  • 返回仅长度数组,不需区间起止或元素列表。

解题路线

  1. 维护 seen 集合和 length 哈希表,只在每个连续区间左右端点存长度即可。
  2. 插入新 x 时读 left=length[x−1] 或 0、right=length[x+1] 或 0,新长度 L=left+1+right;更新新区间左右端点 x−left、x+right 的 length=L,再把 x 加 seen。
  3. 更新全局 best=max(best,L) 并输出;重复 x 直接输出原 best,避免把同一位置二次接桥。
  4. 正确性:插入 x 只可能连接它左侧与右侧两段,其他区间不变;新段长度为两段加 1,端点记录足够支持将来合并。
  5. 用源例及 [1,3,2] 的桥接、重复 [2,2]、负数/零、乱序和空输入测试。

手动走一遍

[2,3,0,4]:2 单段长度1;3 与左段合成 [2,3] 长2;0 自成段 best仍2;4 与 [2,3] 合成 [2,4] 长3,结果 [1,2,2,3]。随后再插 1,可把 [0] 与 [2,4] 接成 [0,4] 长5。

规模与取舍

n 次插入,哈希操作预期 O(1) 每次,总 O(n) 时间与 O(u) 空间,u 为不同值数;若必须确定性最坏界,可用平衡树/区间结构。

易错点与追问

容易失分的边界

  • 只比较相邻输入位置,错过乱序值拼成连续整数段。
  • 重复数字再次执行 left+1+right,长度虚增。
  • 更新新段长度但忘写左右端点,后续桥接读到旧长度。
  • 把当前最后插入所在区间长度当全局最大,忽略别处更长的段。

继续深挖

  • 支持删除数字后怎样维护最长段?
  • 需要返回段起止时怎么存?
  • 流式分布式去重与合并怎样保证一致?
✓已复制微信号!