旋转数组

188 阅读1分钟

初级算法(第三题)

给定一个数组,将数组中的元素向右移动 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]
解题思路
题目要求将元素向右移动 k 个位置,那么我们就可以循环数组将每一项都放在移动后的位置,
我们用(i + k) % length 作为移动后的下标位置,超出数组长度就从头开始
我们需要一个新的数组来作为操作数组,然后将取到的值放到原数组移动后位置。

为什么要创建新数组,直接用原数组不可以吗?
答:如果用原数组的话会混乱掉,因为每次你改变了原数组就会取不到原始数据的值了,所以要有一个不会
混乱掉的新数组

话不多数上代码

/**
 * @param {number[]} nums [1,2,3,4,5,6,7]
 * @param {number} k 3
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    //拿到原数组的长度
    let length = nums.length;
    //创建一个原数组长度的新数组
    let array = new Array(length);
    //循环将原数组每一项存到新数组
    for(let i = 0; i<length; i++){
        array[i] = nums[i];
    };
    //循环将新数组的每一项存到原数组,并向右侧移动k个位置
    for(let i = 0; i<length; i++){
        nums[(i+k)%length] = array[i];
    }
};