旋转数组
地址:https://leetcode-cn.com/problems/rotate-array/
<?php /** * Created by PhpStorm. * User: huahua * Date: 2020/3/18 * Time: 下午6:23 */ /** 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4] 示例 2: 输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100] 说明: 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 要求使用空间复杂度为 O(1) 的 原地 算法。 */ class Solution { /** * @param Integer[] $nums * @param Integer $k * @return NULL */ //三次反转 /** * @param $nums * @param $k * @return mixed * 1。将整个数组反转 * 2。将开始的部分反转 * 3。将结束的部分饭庄 */ function rotate(&$nums, $k) { $len = count($nums); if ($k > $len) { $k = $k % $len; } $nums = $this->reverse($nums, 0, $len - 1); $nums = $this->reverse($nums, 0, $k - 1); $nums = $this->reverse($nums, $k, $len - 1); return $nums; } private function reverse($arr, $left, $right) { while ($left <= $right) { $tmp = $arr[$left]; $arr[$left] = $arr[$right]; $arr[$right] = $tmp; $left++; $right--; } return $arr; } //截取数组 function rotate1(&$nums, $k) { $res_start = array_slice($nums,0,count($nums)-$k); $res_end = array_slice($nums,count($nums)-$k,$k); return array_merge($res_end,$res_start); } } $test = new Solution(); $nums = [1,2,3,4,33,5,6,88,7]; $k = 3; var_dump($test->rotate($nums,$k));