# [189. 旋转数组](https://leetcode-cn.com/problems/rotate-array) [English Version](/solution/0100-0199/0189.Rotate%20Array/README_EN.md) ## 题目描述 <!-- 这里写题目描述 --> <p>给定一个数组,将数组中的元素向右移动 <code>k</code><em> </em>个位置,其中 <code>k</code><em> </em>是非负数。</p> <p> </p> <p><strong>进阶:</strong></p> <ul> <li>尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。</li> <li>你可以使用空间复杂度为 O(1) 的 <strong>原地 </strong>算法解决这个问题吗?</li> </ul> <p> </p> <p><strong>示例 1:</strong></p> <pre> <strong>输入:</strong> nums = [1,2,3,4,5,6,7], k = 3 <strong>输出:</strong> <code>[5,6,7,1,2,3,4]</code> <strong>解释:</strong> 向右旋转 1 步: <code>[7,1,2,3,4,5,6]</code> 向右旋转 2 步: <code>[6,7,1,2,3,4,5] </code>向右旋转 3 步: <code>[5,6,7,1,2,3,4]</code> </pre> <p><strong>示例 2:</strong></p> <pre> <strong>输入:</strong>nums = [-1,-100,3,99], k = 2 <strong>输出:</strong>[3,99,-1,-100] <strong>解释:</strong> 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100]</pre> <p> </p> <p><strong>提示:</strong></p> <ul> <li><code>1 <= nums.length <= 2 * 10<sup>4</sup></code></li> <li><code>-2<sup>31</sup> <= nums[i] <= 2<sup>31</sup> - 1</code></li> <li><code>0 <= k <= 10<sup>5</sup></code></li> </ul> <ul> </ul> ## 解法 <!-- 这里可写通用的实现逻辑 --> 若 `k=3`,`nums=[1,2,3,4,5,6,7]`。 先将 `nums` 整体翻转:`[1,2,3,4,5,6,7]` -> `[7,6,5,4,3,2,1]` 再翻转 `0~k-1` 范围内的元素:`[7,6,5,4,3,2,1]` -> `[5,6,7,4,3,2,1]` 最后翻转 `k~n-1` 范围内的元素,即可得到最终结果:`[5,6,7,4,3,2,1]` -> `[5,6,7,1,2,3,4]` <!-- tabs:start --> ### **Python3** <!-- 这里可写当前语言的特殊实现逻辑 --> ```python class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) k %= n if n < 2 or k == 0: return nums[:] = nums[::-1] nums[:k] = nums[:k][::-1] nums[k:] = nums[k:][::-1] ``` ### **Java** <!-- 这里可写当前语言的特殊实现逻辑 --> ```java class Solution { public void rotate(int[] nums, int k) { if (nums == null) { return; } int n = nums.length; k %= n; if (n < 2 || k == 0) { return; } rotate(nums, 0, n - 1); rotate(nums, 0, k - 1); rotate(nums, k, n - 1); } private void rotate(int[] nums, int i, int j) { while (i < j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; ++i; --j; } } } ``` ### **JavaScript** <!-- 这里可写当前语言的特殊实现逻辑 --> 使用原生 API 将数组的 `k~n-1` 范围内的元素插入到前面 ```js /** * @param {number[]} nums * @param {number} k * @return {void} Do not return anything, modify nums in-place instead. */ var rotate = function (nums, k) { k %= nums.length; nums.splice(0, 0, ...nums.splice(-k, k)) }; ``` ### **...** ``` ``` <!-- tabs:end -->