题目
给你一个数组,将数组中的元素向右轮转
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 };