63.轮转数组

183 阅读1分钟

day:14 189. 轮转数组(中等) 考点:双指针 思路:

  • 第一种解法:新建一个数组,计算每个位置该放的元素,将新数组中的值copy到原数组
  • 官网第二种解法没有看懂
  • 第三种解法:反转整个数组,,以k为界限分别反转[0,k/n-1]区间的元素和[k/n,n-1]区间的元素。至于为什么要界限定在k/n-1是因为需要保证k值的正确性,k最大为数组的长度,此时岂不是修改了k的长度。 使用额外数组
var rotate = function(nums, k) {
    let n = nums.length,newArr = [];
   for(let i =0;i<n;i++){
      newArr[(i+k)%n]=nums[i]
    }
    for(let i = 0;i<n;i++){
      nums[i] = newArr[i]
    }
};

反转数组

//反转数组
function revese(nums,start,end){
  while(start<end){
     //交换数组元素
    [nums[start], nums[end]] = [nums[end], nums[start]];
    start +=1;
    end -= 1;
  }
}
var rotate = function(nums, k) {
   let k = k%nums.length;
  reverse(nums, 0, nums.length - 1);
  reverse(nums,0,k%nums.length-1);
  reverse(nums,k%nums.length,nums.length-1);
};