SWE · CodeSignal OA

Capital One 建障碍块与连续区间可用查询

OA 操作 `[1,x]` 在坐标建块,`[2,start,length]` 查询连续区间能否放置并拼接 0/1 结果。

题目重点:OA 操作 `[1,x]` 在坐标建块,`[2,start,length]` 查询连续区间能否放置并拼接 0/1 结果。

题意与假设

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

  • 训练版 block 占单个整数坐标,`[1,x]` 把 x 加入 occupied 集合,重复建同点为 no-op。
  • `[2,start,length]` 查闭整数点集合 {start,...,start+length−1} 是否与 occupied 相交;length>0。
  • 每个查询输出字符 1(可放)或 0(不可放),依输入顺序拼字符串;查询本身不改变占用。
  • 题目没有给负坐标或无穷轴约束,训练版允许整数坐标。

解题路线

  1. 朴素实现用 set 存占用点;建块 O(1) 预期,查询遍历区间中每个整数点,一旦碰到占用就返回 0,否则 1。
  2. 若查询长度很大而建块较少,改用有序 set 找不小于 start 的首个占用点;若该点≤start+length−1 则拒绝,可 O(log B) 查询。
  3. 把所有查询结果按出现顺序 append 再 join,不要为 build 操作输出位。
  4. 核 `[1,2]` 后查询 start=3,length=2 看 3/4,可放;建 `[1,5]` 后查 start=3,length=3 看 3/4/5,不可放。
  5. 测边界恰落障碍、重复建、查询长 1、连续障碍、没有障碍和大 length 溢出。

手动走一遍

执行 `[1,2]`,`[1,5]` 后 occupied={2,5}。`[2,3,2]` 查 3、4,输出 1;`[2,3,3]` 查 3、4、5,输出 0。若把右端误写成 start+length,会把长 2 的查询错误地包含 5。

规模与取舍

B 个不同障碍、Q 次查询,朴素 set 构建 O(B) 预期空间,单次长度 L 的查询 O(L) 时间;有序树建 O(log B)、查询 O(log B),空间 O(B),还需输出 O(Q) 字符。

易错点与追问

容易失分的边界

  • 把 length 当结束坐标,而不是区间长度。
  • 把右端写成 start+length 导致 off-by-one。
  • 查询成功后自动建块,题目没有此操作。
  • 把 build 操作也输出 0/1,结果位数多了。
  • 凭不完整的样例推断块有宽度或可移动。

继续深挖

  • 支持删除块怎么改?
  • 坐标为连续实数区间或块有长度时如何用区间树?
  • 极大坐标值如何避免逐点扫描?
  • 如果成功查询要立即占用该区间,如何保证并发原子?
✓已复制微信号!