数组顺时针旋转求助:将末尾元素移至开头的循环代码优化
数组旋转问题解决方案
嗨,我来帮你搞定这个把数组最后一个元素移到开头的需求!
先明确你的需求:把类似 [a,b,c,d,e] 的数组,转换成 [e,a,b,c,d],也就是将最后一个元素移至开头,其余元素依次后移。
先说说你现有代码的问题
你当前的循环逻辑不仅绕,还存在数组索引越界的问题——数组的索引是从0开始的,Array[Array.Length] 其实是超出数组范围的位置(数组最大索引是 Array.Length - 1),而且从前往后遍历的方式会导致前面的元素被覆盖,没法完成正确的移位。
正确的循环写法
我们可以换个思路:先保存最后一个元素,然后从倒数第二个元素开始从后往前遍历,把每个元素往后挪一位,最后把保存的元素放到数组开头。代码如下:
// 示例数组 let arr = ['a', 'b', 'c', 'd', 'e']; // 第一步:保存数组最后一个元素 const lastItem = arr[arr.length - 1]; // 第二步:从倒数第二个索引开始,往前遍历到0,逐个后移元素 for (let i = arr.length - 2; i >= 0; i--) { arr[i + 1] = arr[i]; } // 第三步:把保存的最后一个元素放到数组开头 arr[0] = lastItem; console.log(arr); // 输出:['e', 'a', 'b', 'c', 'd']
逻辑解释
- 先抓出最后一个元素存起来,避免移位时被覆盖;
- 从后往前遍历移位,这样每一步处理的元素都还没被修改过,不会出现值覆盖的问题;
- 最后把保存的元素放到第一个位置,完成旋转。
如果你想更简洁实现,其实也可以用数组自带的方法:arr.unshift(arr.pop()),不过既然你需要循环写法,上面的代码就完全能满足需求啦。
内容的提问来源于stack exchange,提问作者Reef Proctor
相关产品推荐
相关产品推荐

