LeetCode_每日一题 面试题 189.轮转数组

文章目录

  • 一、题目
  • 二、题解
    • 错误思路
    • 正确思路
      • 方法1
      • 方法2

一、题目

描述:给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例1:

输入: 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]

示例2:

输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

这里是引用
来源:力扣

二、题解

错误思路

我写完了之后自己用一些小数据测试的时候发现没什么问题
然后丢到leetcode上的时候发现当用大量数据测试的时候会超时,就过不了

var rotate = function(nums, k) {
  let j = nums.length
  while (k > 0) {
    let temp = nums[j - 1]
    for (let i = j-1; i>=0; i--) {
      nums[i] = nums[i-1]
    }
    nums[0] = temp
    k--
  }
  return nums
};
console.log(rotate([1, 2, 3, 4, 5, 6, 7], 3))

输出:[ 5, 6, 7, 1, 2, 3, 4]

正确思路

方法1

思路:

  1. 定义一个新的数组
  2. 将原数组下表i的数放入到新数组下标为(i+k)%9的数中
  3. 将新数组中的数填入原数组中
// 使用额外数组
var rotate = function(nums, k) {
  let l = nums.length
  // 实例化array,给新数组添加9个占位
  let array = new Array(l)
  // 将数填入到新的数组当中
  for (let i = 0; i < l; i++) {
    // 3除9=3,9除9=0,11除9=2
    array[(i+k)%l] =nums[i]
  }
  // 将所有数从新数组添加到nums中
  for (let i = 0; i < l; i++) {
    nums[i]=array[i]
  }
};

方法2

思路:假设数组为[1, 2, 3, 4, 5, 6, 7, 8, 9]需要轮转3次

  1. 先将数组整体翻转
    (7 6 5 4 3 2 1)
  2. 再将数组下标为0-3的数翻转
    (5 6 7 4 3 2 1)
  3. 最后将数组下标为4-7的数进行翻转
    (5 6 7 1 2 3 4)
//翻转数组
var rotate = function(nums, k) {
  const reverse = (nums, start, end) => {
    while (start < end) {
      const temp = nums[start];
      nums[start] = nums[end];
      nums[end] = temp;
      start += 1;
      end -= 1;
    }
  }
    k %= nums.length;
    reverse(nums, 0, nums.length - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
  console.log(nums)
}

你可能感兴趣的:(leetcode每日一题,javascript,前端,html,算法)