题目:
给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。
解法(推荐方法2,3):
/*
* @lc app=leetcode.cn id=189 lang=javascript
*
* [189] 旋转数组
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
// 方法1
// let len = nums.length;
// let rem = k % len;
// if (rem === 0) {
// console.log("reverseNums if")
// return nums;
// }
// let reverseNums = nums.slice(0, len-rem);
// for (let index = 0; index < len-rem; index++) {
// nums.push(reverseNums[index]);
// }
// nums.splice(0, len-rem);
// 方法2
// nums.splice(nums.length - k) 返回一个新数组[ 5, 6, 7 ]
// 并且修改nums数组为[ 1, 2, 3, 4 ]
// nums.splice(0, 0, ...nums.splice(nums.length - k));
// 方法3
// unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。
// nums.unshift(...nums.splice(nums.length - k));
// 方法4
// pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
for (let index = 0; index < k; index++) {
nums.splice(0,0,nums.pop())
}
};
// @lc code=end