JavaScript实现数组n次左旋转的代码问题修正
数组n次左旋转实现
你的现有代码仅实现了单次左旋转的逻辑,没有处理传入的旋转次数参数n,两种可行的实现方式如下:
基于原有逻辑改造
你写的单次左移逻辑本身可以跑通,只需要在外层增加对应次数的循环即可。需要注意:当旋转次数大于数组长度时,旋转一整轮(次数等于数组长度)数组会回到初始状态,所以可以提前对n取模,去掉无效的重复计算。
function rotateLeft(arr, n) { // 边界情况直接返回 if (!arr.length || n === 0) return arr; const actualRotateTimes = n % arr.length; let result = [...arr]; for (let i = 0; i < actualRotateTimes; i++) { // 单次左旋转:把头部元素移到尾部 const headItem = result.shift(); result.push(headItem); } return result; } // 测试:旋转3次 console.log(rotateLeft([1,2,3,4,5], 3)); // 输出 [4,5,1,2,3]
高性能一次性实现
左旋转n次的本质,就是把数组前n个元素整体移动到数组尾部,不需要循环多次遍历,直接通过数组切片就能一次性得到结果,时间复杂度更低:
function rotateLeft(arr, n) { if (!arr.length || n === 0) return arr; const actualRotateTimes = n % arr.length; // 切片拼接:后半段 + 前n个元素 return arr.slice(actualRotateTimes).concat(arr.slice(0, actualRotateTimes)); } console.log(rotateLeft([1,2,3,4,5], 3)); // 输出 [4,5,1,2,3]
提示:不要直接修改传入的原数组,否则会产生副作用影响外部其他逻辑,建议操作前先做数组拷贝。
内容的提问来源于stack exchange,提问作者Tanmoy Sarker
相关产品推荐
相关产品推荐

