题目:
给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。
输入:[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]
解题思路:
旋转数组实际上就是把数组的数字向后移动k位,末位的数字自动填充到前面的位置。
方法一:
可以看作是把后面的k位数字直接截取出来(this.slice(-k)),与前面的数字的数组(this.slice(0,this.length - k)拼接即可。
slice() 方法可从已有的数组中返回选定的元素。
slice() 参数使用负值则表示从数组的尾部选取元素。
slice()传start和end参数,则表示返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
concat() 方法用于连接两个或多个数组。
function rotate(k) {
if(k < 0 || k === 0 || k === this.length) {
return this;
}
//旋转数组-方法1
return this.slice(-k).concat(this.slice(0,this.length - k));
}
Array.prototype.rotate = rotate;
let arr = [1,2,3,4,5,6,7];
console.log(arr.rotate(3));
运行结果如图:
方法二:
思路同方法1一样。使用扩展运算符…
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。(该方法会改变原始数组)
splice() 方法参数index,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
扩展运算符… 把数组或类数组对象展开成一系列用逗号隔开的值
function rotate(k) {
if(k < 0 || k === 0 || k === this.length) {
return this;
}
//旋转数组-方法2
return [...this.splice(this.length - k),...this]
}
Array.prototype.rotate = rotate;
let arr = [1,2,3,4,5,6,7];
console.log(arr.rotate(3));
运行结果如图
方法三:
遍历数组,执行k次删除数组的最后一个元素,并将返回的元素加在数组的头部。
备注:
pop() 方法用于删除并返回数组的最后一个元素。
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
function rotate(k) {
if(k < 0 || k === 0 || k === this.length) {
return this;
}
//旋转数组-方法3
for(let i = 0;i < k;i ++) {
this.unshift(this.pop());
}
return this;
}
Array.prototype.rotate = rotate;
let arr = [1,2,3,4,5,6,7];
console.log(arr.rotate(3));
运行结果如图
方法四:
创建一个k位的空数组,遍历空数组,删除原数组的最后一个元素,并将返回的元素加在数组的头部。(思路同方法3)
new Array(k).fill(’’)表示初始化一个长度为k的空数组,并用fill()传的指定的参数value填充空数组。
function rotate(k) {
if(k < 0 || k === 0 || k === this.length) {
return this;
}
//旋转数组-方法4
new Array(k).fill('').forEach(()=> {
this.unshift(this.pop());
})
return this;
}
Array.prototype.rotate = rotate;
let arr = [1,2,3,4,5,6,7];
console.log(arr.rotate(3));
运行结果如图