轮转数组
题目:轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
举个例子,比如:nums = [1,2,3,4,5] k = 3时,
- 第一轮 数组从最后一位开始遍历整个数组得到结果
[5,1,2,3,4] - 第二轮 以上一轮得到的结果再从最后一位开始遍历得到
[4,5,1,2,3] - 第三轮 步骤与上一步相同得到
[3,4,5,1,2]
# 方法一:遍历数组
通过上面的每步变化我们可以看到数组还是原来数据只是数据的起点下标变了,上面的数据可以看成是从下标nums.length - k 到nums.length - k - 1的数据,根据上面的原理我们可以轻易写出下面代码:
var rotate = function(nums, k) {
// 遍历的起点,超出length的需要取余处理
let start = k > nums.length ? nums.length - (k % nums.length) : nums.length - k
const cNums = nums.concat()
for(let i = 0; i < nums.length; i++) {
// 取余长度避免越界
nums[i] = cNums[(start + i) % nums.length]
}
};
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 方法二:出入栈方式
根据第一轮到第三轮的变化规律可以看到,每一步数组先pop数据再把pop出来的数据推到数组首部,形成一个不断循环出栈入栈的过程。
var rotate = function(nums, k) {
let times = k % nums.length,pArr = []
for(let i = 0; i < times; i++) {
pArr.push(nums.pop())
}
// unshift时间消耗很大,不要在pop时unshift数据,要在结束后统计处理
pArr.reverse()
nums.unshift(...pArr)
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 方法三:数组拼接
同样,我们可以看到[3,4,5,1,2]与[1,2,3,4,5]的区别在于把尾部的3,4,5拼接到数组的首部,所有我们也可以通过数组的简单拼接实现:
var rotate = function(nums, k) {
// 遍历的起点 也是剪切拼接的起点
let start = k > nums.length ? nums.length - (k % nums.length) : nums.length - k
// 剪切尾部
const sArr = nums.slice(start)
// 删除尾部
nums.splice(start, sArr.length)
// 拼接尾部到首部
nums.unshift(...sArr)
};
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
提示
几种方式
上次更新: 2025/09/05, 8:09:00