SWE · CodeSignal OA

Capital One 循环位移绝对差:所有 Shift 结果排序

OA 给两个等长数组,对全部 n 个循环平移求对应元素绝对差总和,再将各结果非降序输出。

题目重点:OA 给两个等长数组,对全部 n 个循环平移求对应元素绝对差总和,再将各结果非降序输出。

题意与假设

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

  • 训练版 t=0..n−1,score(t)=Σ_i |A[(i+t) mod n]−B[i]|;左移/右移只是 t 的排列,最终排序后的多重集合相同。
  • 空数组 n=0 返回空数组;绝对差和用足够宽整数/BigInt,题目没给数值上限。
  • 若要求保留 shift ID,则方向影响结果配对,需问清;本题只返回已排序的 score。

解题路线

  1. 直接枚举 n 个 shift、每个比较 n 对元素,得到 n 个 score,再排序;先用这个 O(n²) 正确基线覆盖功能。
  2. 观察位移方向:右移 t 等价左移 n−t,因 t 遍历所有值,score 多重集合不变;但单个 t 标签不同。
  3. 测试 n=0/1、相同数组、重复值、负数、所有 shift 得分不同和大整数溢出。
  4. 若 n 很大,绝对值不具备一般数值数组下简单的单次卷积拆法;应先问值域与规模,有限小值域可按值分桶/卷积加速,不能无条件承诺 O(n log n)。

手动走一遍

训练 A=[1,3]、B=[2,4]:t=0 得 |1−2|+|3−4|=2;t=1 得 |3−2|+|1−4|=4;排序返回 [2,4]。

规模与取舍

n 个 shift 各扫描 n 个元素 O(n²),排序 n 个分数 O(n log n),总 O(n²) 时间、O(n) 输出与工作空间;具体优化须依据值域约束。

易错点与追问

容易失分的边界

  • 只返回最小一个 score,题目要求全部排序。
  • 把循环位移当普通平移而丢出界元素。
  • 直接比较两个数组排序后位置,改变原有对应关系。
  • 声称能用普通相关卷积直接求绝对值差,却没有值域/分解条件。

继续深挖

  • 要同时返回 shift ID 如何处理同分与方向?
  • 数值仅 0/1 时可怎样用相关性加速?
  • 如果只求最小 score,能否省排序?
  • 多次查询不同 B 如何预处理 A?
✓已复制微信号!