这是我参与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))
优化
这里我们多考虑几种数组的情况,比如说轮转k的n倍的,我们其实只需要轮转余数就可以了
这里我们就要就加入一个判断,判断k和len
- 如果
k和len的取余为0,直接返回nums - 如果
k大于len,那么取余数,如果小于k的话,就直接循环k for循环这里,我们其实可以直接点,使用nums.splice(-turnK)
第一步判断取余
let len = nums.length
if(k%len=== 0) {
return nums
}
第二步
判断k和len的大小比值
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))
这只是我个人的思想,希望能得到大家更好的方法的指点,非常感谢!!!