【算法】将一个数组旋转K步
拓展
unshift shift splice 时间复杂度比较高 (动了原数组了)
push pop 时间复杂度比较快 slice() 不动原数组所以也很快 时间复杂度O(1)
旋转K步
算法一
//时间复杂度O(n^2) 空间复杂度O(1)
function rotate1 (arr:number[],k:number):number[]{
const length=arr.length
if(!k||length===0) return arr
const step=Math.abs(k%length) //abs取绝对值
// 时间 O(n^2) 空间O(1)
for(let i=0;i<step;i++){
const n=arr.pop()
if(n){
arr.unshift(n)
}
}
return arr
}
算法二
//拆分数组 最后连接concat 拼接返回
//时间复杂度O(1) 没有循环所以是O(1) 空间复杂度O(n)(不重要)
function rotate2 (arr:number[],k:number):number[]{
const length=arr.length
if(!k||length===0) return arr
const step=Math.abs(k%length) //abs取绝对值
const part1=arr.slice(-step)
const part2= arr.slice(0,length-step)
const part3=part1.concat(part2)
return part3
}
const arr=[1,2,3,4,5,6,7]
const arr1=rotate2(arr,3)
console.info(arr1) //[5,6,7,1,2,3,4]