一维数组平移与交换的核心是索引规律和边界处理:右移用三段反转或取模索引映射,左移等价于右移(n−k)步,交换可用临时变量、异或或python解包,区间操作需双指针或三次反转。

一维数组的元素平移与交换是基础但高频的操作,核心在于理解索引变化规律,避免越界和覆盖。关键不是写复杂代码,而是理清移动方向、步长和临时存储逻辑。
向右平移(循环右移)
将数组末尾 k 个元素移到开头,其余元素顺次后移。常用场景如时间轮调度、密码移位。
- 先对 k 取模:k = k % n(防止 k 大于数组长度导致冗余移动)
- 分三段反转:整体反转 → 前 k 个反转 → 后 n−k 个反转(空间 O(1),时间 O(n))
- 或用临时数组:new_arr[i] = old_arr[(i − k + n) % n](直观,空间 O(n))
向左平移(循环左移)
把开头 k 个元素移到末尾,本质是右移 (n−k) 步,也可直接处理。
- 同样先取模:k = k % n
- 反转法:整体反转 → 前 n−k 反转 → 后 k 反转
- 索引映射更直白:new_arr[i] = old_arr[(i + k) % n]
任意两位置元素交换
最简操作,但要注意是否需原地交换或保留原数组。
- 标准三步:temp = arr[i]; arr[i] = arr[j]; arr[j] = temp
- 异或技巧(仅限整数,且 i ≠ j):arr[i] ^= arr[j]; arr[j] ^= arr[i]; arr[i] ^= arr[j](省临时变量,但可读性差)
- Python 支持直接解包:arr[i], arr[j] = arr[j], arr[i]
区间内元素翻转或交换
比如将子数组 [l, r] 整体反转,或交换两个等长子数组 [a,b] 和 [c,d]。
- 单区间反转:双指针从两端向中间交换,l++, r−−
- 交换两个子数组:先反转前段,再反转后段,最后反转整体(三次反转法)
- 注意边界检查:确保 l ≤ r,且子数组长度相等(交换时)











