前端面试真题,两周刷完100道。2. 把一个数组旋转 k 步

70 阅读1分钟

题目

输入 一个数组[1,2,3,4,5,6,7] k=3. 即旋转3步 输出 [5,6,7,1,2,3,4]

思路

  • 思路1 把末尾的元素挨个pop, 然后 unshift 到数组前面
  • 思路2 把数组拆分,最后 concat 拼接到一起

代码实现 思路1

let arr = [1,2,3,4,5,6,7]
let k = 3

function rev1 (list, k) {
  for(let i=0; i<k;i++) {
    let end = list.pop()
    list.unshift(end)
  }
  return list
}
console.log(rev1(arr,k))

思路2

function rev2 (list, k) {
  const length = list.length;
  const endlist = list.slice(-k)
  const startlist = list.slice(0, length - k)
  return endlist.concat(startlist)
}

console.log(rev2(arr,k))

复杂度分析

思路1

  • 时间复杂度 对传入的数组进行一次for 循环遍历,unshift 这个数组的api 的过程是先把数组元素向后挪一位,然后插入一个元素。 这样就是两个时间复杂度是O(n) 的结合。 所以时间复杂度是O(n^2)
  • 空间复杂度 代码中没有新增数组,没有造成额外的空间存储,空间复杂度是O(1)

思路2

  • 时间复杂度 代码中没有循环,原数组没有变化, 时间复杂度为O(1)
  • 空间复杂度 新生成了两个新数组,使用了新的存储空间,所以空间复杂度为O(n)

总结

在前端应用中,选择时间复杂度小的方案。

2周刷完100道前端优质面试真题 mu课 视频及资料领取请关注:奋斗的刚子