旋转数组

Posted Smile沛沛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组相关的知识,希望对你有一定的参考价值。

旋转数组

给定一个数组,将数组中的元素向右移k个位置,其中k是非负数,例如:

输入:[1,2,3,4,5,6]和k=3

输出:[5,6,1,2,3,4]

  • slice
输入:[1,-100,78,90]  k = 2
输出:[90,1,-100,78]

function rotate(key){
  //参数处理,key>0
  if(key<0||key === 0||key === this.length)return this;
  if(key>this.length){key = key%this.length}
  //slice支持负数索引,直接就是数组的后几位
   return this.slice(-key).concat(this.slice(0,this.length-key))
}
Array.prototype.rotate = rotate;



let arr = [1,2,3,4,5,6,7],
		k = 3;
arr.rotate(3);		// [5, 6, 7, 1, 2, 3, 4]

slice参数:开始点,结束点,返回:切割的数组

splice参数:开始点、长度,返回:删除的这部分返回

  • splice
输入:[1,-100,78,90]  k = 2
输出:[90,1,-100,78]

function rotate(key){
  //参数处理,key>0
  if(key<0||key === 0||key === this.length)return this;
  if(key>this.length){key = key%this.length}
  
   return this.splice(this.length-key,key).concat(this)
}
Array.prototype.rotate = rotate;



let arr = [1,2,3,4,5,6,7],
		k = 3;
arr.rotate(3);		// [5, 6, 7, 1, 2, 3, 4]
  • 最后一项删除放到最开头,执行k次
输入:[1,-100,78,90]  k = 2
输出:[90,1,-100,78]

//写法一:
function rotate(key){
  //参数处理,key>0
  if(key<0||key === 0||key === this.length)return this;
  if(key>this.length){key = key%this.length}
  
   for(let i = 0;i<=key;i++){
     this.unshift(this.pop());		//this.pop()最后一项;unshift首部插入
   }
   return this;
}
Array.prototype.rotate = rotate;

//写法二:
function rotate(key){
  //参数处理,key>0
  if(key<0||key === 0||key === this.length)return this;
  if(key>this.length){key = key%this.length}
  
  new Array(k).fill('').forEach((item)=>{
    this.unshift(this.pop());		//this.pop()最后一项;unshift首部插入
  })
   return this;
}
Array.prototype.rotate = rotate;

let arr = [1,2,3,4,5,6,7],
		k = 3;
arr.rotate(3);		// [5, 6, 7, 1, 2, 3, 4]

以上是关于旋转数组的主要内容,如果未能解决你的问题,请参考以下文章

Butterknife 片段旋转给出 NullPointer

如何在没有活动旋转的情况下旋转活动内的片段?

旋转后片段字段为空

使用导航抽屉旋转时的片段更改

在我旋转屏幕之前,LiveData 不会加载到片段中

屏幕旋转后Android片段重叠