【面试经典150题】轮转数组 JavaScript

80 阅读1分钟

🔗题目链接

🎇题目描述

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

🎇数据范围

  • 1 <= nums.length <= 10510^5
  • 231-2^{31} <= nums[i] <= 2312^{31} - 1
  • 0 <= k <= 10510^5

🎇方法1

使用辅助数组记录移出的元素,然后再将元素移到开头。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    let tk=k%nums.length;
    let temp=[];
    while(tk--){
        temp.unshift(nums.pop());
    }
    nums.unshift(...temp);
};

unshift时间复杂度为O(n)O(n)

时间复杂度:O(n2)O(n^2)

空间复杂度:O(tk)O(tk)

🎇方法2

使用splice方法,将数组后面的元素移动到数组前面。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var rotate = function(nums, k) {
    let tk=k%nums.length;
    nums.unshift(...nums.splice(nums.length-tk,tk));
}

时间复杂度:O(n)O(n)

空间复杂度:O(tk)O(tk)

🎗方法3

先将整个数组反转,然后将前k个元素反转,再将后面的元素反转。

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var reverse=function(nums,start,end){
    while(start<end){
        let temp=nums[start];
        nums[start]=nums[end];
        nums[end]=temp;
        start++;
        end--;
    }
}
var rotate = function(nums, k) {
    let tk=k%nums.length;
    reverse(nums,0,nums.length-1);
    reverse(nums,0,tk-1);
    reverse(nums,tk,nums.length-1);
};

时间复杂度:O(n)O(n)

空间复杂度:O(1)O(1)