题目
输入 一个数组[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课 视频及资料领取请关注:奋斗的刚子