今天我们分享旋转数组的另一种解法:
给定一个数组,将数组中的元素向右移动 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]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
从题目可以了解到是把数组元素向右移动,而数组是有长度的,那如何把末尾的元素移动到头部呢? 这个时候我们想到可以把nums看成一个环形数组, 这个题目给了我们一个k,代表数组中的每个元素都需要向右移动k个位置
/**
* @param {number[]} nums
* @param {number} k
* @return {void} Do not return anything, modify nums in-place instead.
*/
var rotate = function(nums, k) {
var index=0;
//我们从第一个元素开始移动,先保存它的值
var hold=nums[0];
var temp;
//创建一个boolean数组,初始值为false
var visited =new Array(nums.length);
for(let v=0;v<nums.length;v++){
visited[v]=false;
}
for(let i=0;i<nums.length;i++){
//寻找数组移动k个元素的位置
//这一步实现了数组的环形移动,一旦数组元素要移动的位置超过数组长度,元素就会从头开始
index=(index+k)%nums.length;
//一旦visited对应的值为true,就代表已经访问过了,就从它的下一个位置开始
if(visited[index]){
//寻找当前已经移动过了的元素的下一个元素,作为要移动元素的初始位置
index=(index+1)%nums.length;
//找到之后,先保存它的位置
hold=nums[index];
//这个是找要移动元素的初始位置,没有进行移动,所以这个时候i--
i--;
}else{
//如果该元素没有移动过,就进行移动
//标记为已替换过
visited[index]=true;
//先保存当前值
temp=nums[index];
//当前元素被替换为前一个保存的值
nums[index]=hold;
hold=temp;
}
}
};
|