旋转数组(右旋转)
给定一个数组,将数组中的元素向右移动 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]V
向右旋转 3 步: [5,6,7,1,2,3,4]
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1
,每次循环都将最后一个元素移到index=0的位置:
var rotate = function (nums, k) {
let temp, length = nums.length
for (let i = 0; i < k; i++) {
temp = nums[length - 1]
for (let o = 0; o < length - 1; o++) {
nums[(length - o - 1)] = nums[(length - o - 2)]
}
nums[0] = temp
}
};
这里是创建了一个中间变量:temp
,每次nums[0]被赋值之后,temp都需要获取一次nums[nums.length-1]
的值
2
,tempNums
为nums数组倒过来的数组,每次循环时,将tempNUms
中对应的数值赋值给nums中对应的数组
let rotate = function (nums, k) {
let tempNums;
//创建完全反转的数组
for (let circulate = 0; circulate < k; circulate++) {
tempNums = []
for (let i = nums.length - 1; i > -1; i--) {
tempNums.push(nums[i])
}
for (let o = 0; o < nums.length; o++) {
if (o === 0) {
nums[0] = tempNums[0]
} else if (o === (nums.length - 1)) {
nums[nums.length - 1] = tempNums[1]
} else {
nums[o] = tempNums[nums.length - o]
}
}
}
}
如下图,每次赋值使用if
,else if
判断首尾应该怎样赋值给nums而不会导致数组位置错乱(除了首尾的赋值,其他的赋值使用的一套代码即可)
3
,使用splice每次获取最后一个数字,并使用unshift将该数字添加到数组首位,循环k次:
var rotate = function (nums, k) {
for (let i = 0; i < k; i++) {
nums.unshift(...nums.splice(nums.length - 1, 1))
}
};
4
,一次性获取要移动的最后k位数字,并添加到头部:
var rotate = function (nums, k) {
nums.splice(0, 0, ...nums.splice(nums.length - k))
}
注意此处是使用...nums
进行传值,此时是传入的数字,如果使用nums
直接进行传值,它传入的是一个数组对象,而非一个个数字
最后,要注意splice
和unshift
的用法:
- nums.splice(index,howmany,item1,…,itemX)
参数 | 描述 |
---|---|
index | 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 |
howmany | 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 |
item1, …, itemX | 可选。向数组添加的新项目。 |
- arrayObject.unshift(newelement1,newelement2,…,newelementX)
参数 | 描述 |
---|---|
newelement1 | 必需。向数组添加的第一个元素。 |
newelement2 | 可选。向数组添加的第二个元素。 |
newelementX | 可选。向数组添加的新项目。 |