开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情
题目
给你一个数组,将数组中的元素向右轮转
k个位置,其中k是非负数。
输入: 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]
思路一
我们先创建一个result数组,用来存放调整位置后的数组元素,使用形参k和当前形参nums数组的长度进行取余更新k形参值,然后for循环旧数组中的数组元素,将每个元素的下标加上需要挪动的位置K,将结果对数组长度取余,即为新数组中的新位置,同时将此时旧数组中i位置的数组元素赋值给新数组中取余出来的新位置,循环完成后,新数组即为求解结果,此时将它循环一遍赋值给旧数组即可
var rotate = function(nums, k) {
let result = []
k = k % nums.length;
for (let i = 0; i <= nums.length-1; i++) {
result[(i+k) % nums.length] = nums[i];
}
for(let i = 0; i<=result.length-1; i++) {
nums[i] = result[i];
}
};
思路二
我们先将形参k和nums数组的长度进行取余进行更新形参k值,然后使用if判断当前的k,在声明五个变量,len变量是nums数组的长度,start变量是开始位置默认为0,i变量为当前位置也默认为0,temp变量为当前变量的新值,默认值是当前nums数组的len-k位置的值,count变量是当前已经操作多少个元素,用于判断是否继续循环,我们在循环中先保存当前位置的初始值,将当前位置赋予新值,再讲当前值赋值给temp变量,然后再使用计算下个位置用i变量进行存储,然后再使用if判断,如果当前i变量等于start变量,那么就说明回到了七点,将start变量自增1重新赋值给i变量,并将temp变量更新,最后将count自增1,最后将nums数组返回即可
var rotate = function (nums, k) {
k %= nums.length;
if (k) {
var len = nums.length;
var start = 0;
var i = 0;
var temp = nums[len - k];
var count = 0;
while (count !== len) {
var tmp = nums[i];
nums[i] = temp;
temp = tmp;
i = (i + k) % len;
if (i === start) {
i = ++start;
temp = nums[len - k + start]
}
count++;
}
}
return nums
};