题目重点:OA 给两个等长数组,对全部 n 个循环平移求对应元素绝对差总和,再将各结果非降序输出。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版 t=0..n−1,score(t)=Σ_i |A[(i+t) mod n]−B[i]|;左移/右移只是 t 的排列,最终排序后的多重集合相同。
- 空数组 n=0 返回空数组;绝对差和用足够宽整数/BigInt,题目没给数值上限。
- 若要求保留 shift ID,则方向影响结果配对,需问清;本题只返回已排序的 score。
解题路线
- 直接枚举 n 个 shift、每个比较 n 对元素,得到 n 个 score,再排序;先用这个 O(n²) 正确基线覆盖功能。
- 观察位移方向:右移 t 等价左移 n−t,因 t 遍历所有值,score 多重集合不变;但单个 t 标签不同。
- 测试 n=0/1、相同数组、重复值、负数、所有 shift 得分不同和大整数溢出。
- 若 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?
