PHP 数组元素右旋转算法实现

6次阅读

PHP 数组右旋转推荐三次翻转法:先整体翻转,再翻转前 k 个,最后翻转后 n−k 个,时间 O(n)、空间 O(1);切片拼接法简洁但空间 O(n),适用于可读性优先场景。

PHP 数组元素右旋转算法实现

PHP 中实现数组元素右旋转,核心是把数组末尾的 k 个元素移到开头,其余元素顺次后移。关键在于处理 k 超过数组长度的情况(取模),以及避免额外空间开销(原地旋转更优)。

方法一:三次翻转(推荐,原地、高效、O(1) 空间)

利用翻转的可逆性:右旋 k 步 = 先整体翻转 → 再翻转前 k 个 → 最后翻转后 n−k 个。

  • 先对整个数组翻转
  • 再对索引 0 到 k−1 的子数组翻转
  • 最后对索引 k 到 n−1 的子数组翻转
  • 注意:k 需先对数组长度取模($k = $k % count($arr)),防止越界

示例代码:

function rotateRight(&$arr, $k) {if (empty($arr)) return;     $n = count($arr);     $k = $k % $n;     if ($k == 0) return; <pre class="brush:php;toolbar:false;">// 翻转整个数组 reverse($arr, 0, $n - 1); // 翻转前 k 个 reverse($arr, 0, $k - 1); // 翻转后 n-k 个 reverse($arr, $k, $n - 1);

}

立即学习 PHP 免费学习笔记(深入)”;

function reverse(&$arr, $start, $end) {while ($start

// 使用示例 $arr = [1, 2, 3, 4, 5, 6]; rotateRight($arr, 2); // 结果:[5, 6, 1, 2, 3, 4]

方法二:切片拼接(简洁,但生成新数组)

适合对空间不敏感、追求代码可读性的场景。用 PHP 数组切片函数直接截取并组合。

  • 取后 k 个元素:array_slice($arr, -$k)
  • 取前 n−k 个元素:array_slice($arr, 0, $n - $k)
  • 合并:array_merge($rightPart, $leftPart)
  • 同样需先做 $k %= count($arr)

示例代码:

function rotateRightSlice($arr, $k) {if (empty($arr)) return $arr;     $n = count($arr);     $k = $k % $n;     if ($k == 0) return $arr; <pre class="brush:php;toolbar:false;">$right = array_slice($arr, -$k); $left = array_slice($arr, 0, $n - $k); return array_merge($right, $left);

}

边界与注意事项

  • 空数组或单元素数组:直接返回,无需操作
  • k 为负数 :可转为等效正向左旋,或按需求抛异常 / 取绝对值后转右旋
  • k 大于数组长度 :必须取模,否则 array_slice($arr, -$k) 可能返回空或意外结果
  • 引用传参(&$arr)仅在原地修改时需要;切片法默认返回新数组,不影响原数组

性能对比简要说明

  • 三次翻转:时间 O(n),空间 O(1),适合大数据量或内存受限场景
  • 切片拼接:时间 O(n),空间 O(n),代码短、易理解,PHP 内部优化好,日常使用足够
  • 不建议用循环逐个移动(O(n×k) 时间复杂度),尤其 k 接近 n 时效率极低

text=ZqhQzanResources