算法练习第3道-轮转数组

260 阅读1分钟

这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战

题目

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

思路

从题目上知道的意思是把数组的最后一位,向右转,转到左边,形成一个循环。

处理1

  • 获取数组,并将数组最后一位拿掉
  • 将拿掉的最后一位插入数组的第一位
  • 依次循环k

第一步

拿数组最后一位,我这里使用了splice,splice操作会改变数组,我们再拿到的数组就是少了最后一位的数组

let leftArr = nums.splice(-1)

第二步

leftArr就是我们需要插入数据的数组,现在我们可以把这个leftArr插入nums的头部,但是这个数组我们要处理下,因为我们插入的是单独一个数据,而不是一个数组,因此要解构一下,插入我们使用的是unshift

如下

nums.unshift(...leftArr)

第三步

这样我们就其实已经达到我们想要的目的了,现在需要只是看移动多少位,代码如下

for(let i = 0; i < k; i++) {
   let leftArr = nums.splice(-1)
   nums.unshift(...leftArr)
}

整体代码

let nums = [1, 2, 3, 4, 6, 7], k = 3

let rotate = function(nums, k) {
  for(let i = 0; i < k; i++) {
    let leftArr = nums.splice(-1)
    nums.unshift(...leftArr)
  }
  return nums
}

console.log(rotate(nums, k))

优化

这里我们多考虑几种数组的情况,比如说轮转kn倍的,我们其实只需要轮转余数就可以了

这里我们就要就加入一个判断,判断klen

  • 如果klen的取余为0,直接返回nums
  • 如果k大于len,那么取余数,如果小于k的话,就直接循环k
  • for循环这里,我们其实可以直接点,使用nums.splice(-turnK)

第一步判断取余

let len = nums.length
  if(k%len=== 0) {
    return nums
  }

第二步

判断klen的大小比值

if(k > len) {
    ....
} else {
    ....
}

第三步

优化for循环

nums.unshift(...nums.splice(-turnK))

以上就是我们优化的细节

完整代码如下

let nums = [1, 2, 3, 4, 6, 7], k = 2

let rotate = function(nums, k) {
  let len = nums.length
  let turnK = 0 
  if(k%len=== 0) {
    return nums
  }
  if(k > len) {
    turnK = k%len
  } else {
    turnK = k
  }
  nums.unshift(...nums.splice(-turnK))
  return nums
}

console.log(rotate(nums, k))

这只是我个人的思想,希望能得到大家更好的方法的指点,非常感谢!!!