【初级算法|数组】03-数组按 K 位轮转

114 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述:

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

思路分析:

通过使用一个临时数组,将轮转后的值存到新数组的新位置。需要注意的是,数组的临界,即如果超过最大的长度时需回到数组首位继续计算。

如nums = [-1,-100,3,99], k = 2

其中,3 在第i = 2 位,位移 k= 2位,则应该在 第 i = 4位,但是数组的长度是length = 4,轮转到i= 4时应该转到 i= 0位。所以临界条件时 i>=4 时,轮转后的位置应该是 i-length。

但是对于,如果数组只有一个元素,或者说数组内元素少于要乱转的位置数,以上就无法满足,所以需要使用(i + k) % length来计算轮转后的位置。

以上使用了一个临时数组,如果在原数组上如何解决呢?

通过先全部都进行反转,再反转前 K 个 ,最后再将剩余的都反转,其实整个过程就是最后的结果

原数组:【-1,100,3,99】

全部反转:【99,3,100,-1】

反转前 2个:【3,99,100,-1】

再反转剩余的:【3,99,-1,100】

就得到最终结果了。

AC 代码:

使用临时数组实现

var rotate = function(nums, k) {
    var temps =[];
    for(var i=0;i<nums.length;i++){
        temps[(i+k)%nums.length] = nums[i];
    }
​
     for(var i=0;i<nums.length;i++){
        nums[i] = temps[i];
    }
};

要求空间复杂度为 O(1)的实现

var rotate = function(nums, k) {
  int leng = nums.length;
  k % = leng
  reverse(nums,0, leng-1)
  reverse(nums,0, k-1)
  reverse(nums,k, leng-1)
}
​
function reverse(nums, start, end){
  while(start<end){
    let temp = nums[start];
    nums[start++] = nums[end]
    nums[end--] = temp;
  }
}

\