JS之数组旋转

【 学习探索过程中记下的点点笔记,以供分享,欢迎大家一起学习探讨~如有雷同可附链接,谦虚学习!】

题目:
给定一个数组,将数组中的元素向右移动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));

运行结果如图在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值