描述:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例1:
输入: nums = [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:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
提示:
我写完了之后自己用一些小数据测试的时候发现没什么问题
然后丢到leetcode上的时候发现当用大量数据测试的时候会超时,就过不了
var rotate = function(nums, k) {
let j = nums.length
while (k > 0) {
let temp = nums[j - 1]
for (let i = j-1; i>=0; i--) {
nums[i] = nums[i-1]
}
nums[0] = temp
k--
}
return nums
};
console.log(rotate([1, 2, 3, 4, 5, 6, 7], 3))
输出:[ 5, 6, 7, 1, 2, 3, 4]
思路:
- 定义一个新的数组
- 将原数组下表i的数放入到新数组下标为(i+k)%9的数中
- 将新数组中的数填入原数组中
// 使用额外数组
var rotate = function(nums, k) {
let l = nums.length
// 实例化array,给新数组添加9个占位
let array = new Array(l)
// 将数填入到新的数组当中
for (let i = 0; i < l; i++) {
// 3除9=3,9除9=0,11除9=2
array[(i+k)%l] =nums[i]
}
// 将所有数从新数组添加到nums中
for (let i = 0; i < l; i++) {
nums[i]=array[i]
}
};
思路:假设数组为[1, 2, 3, 4, 5, 6, 7, 8, 9]需要轮转3次
- 先将数组整体翻转
(7 6 5 4 3 2 1)- 再将数组下标为0-3的数翻转
(5 6 7 4 3 2 1)- 最后将数组下标为4-7的数进行翻转
(5 6 7 1 2 3 4)
//翻转数组
var rotate = function(nums, k) {
const reverse = (nums, start, end) => {
while (start < end) {
const temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
console.log(nums)
}