You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组右移一位:正序遍历代码错误原因及遍历方式疑问

数组右移一位问题的正序遍历实现疑问解答

1. 你的代码错误原因

你的代码存在两个核心问题:

  • 循环范围错误:for(int i=1; i<n-1; i++) 的终止条件是 i < n-1,循环仅处理到索引 n-2,完全遗漏了最后一个元素的位置(索引 n-1),导致数组末尾的值始终未被正确更新。
  • 逻辑方向错误:循环中执行 arr[i] = arr[i+1] 是将右侧元素覆盖到左侧,本质是左移操作,和“右移一位”的需求完全相反。最后执行 arr[0] = arr[n-1] 时,arr[n-1] 已经是未被处理的无效值,最终结果完全不符合预期。

比如原数组为 [1,2,3,4,5],你的代码执行后会得到 [5,3,4,5,5],和正确结果 [5,1,2,3,4] 相差甚远。

2. 能否用正序遍历实现该功能?

可以实现,但需要调整逻辑,引入额外临时变量保存未被处理的元素值,避免覆盖丢失数据。示例代码如下:

class CheckRotateArray{
    public static void rotateArray(int[] arr){
        int n = arr.length;
        if (n <= 1) return; // 处理数组长度为0或1的边界情况
        
        int lastElement = arr[n-1];
        int temp = arr[0];
        arr[0] = lastElement;
        
        // 正序遍历,逐个将前一个元素的旧值赋给当前位置
        for(int i=1; i<n; i++){
            int currentTemp = arr[i];
            arr[i] = temp;
            temp = currentTemp;
        }
    }
}

这段代码通过临时变量 temp 持续保存上一个位置的原始值,正序遍历过程中逐步将旧值传递到右侧,最终完成右移一位的效果。

3. 为何倒序遍历更合适?

倒序遍历的优势在于:

  • 无需额外临时变量:除了保存最后一个元素的变量外,不需要其他临时存储。倒序从索引 n-1 遍历到 1,直接将 arr[i] 赋值为 arr[i-1],此时 arr[i-1] 的值还未被覆盖,不会丢失数据。
  • 逻辑更简洁直观:完全贴合右移的操作逻辑——从最右侧开始,依次将左侧元素向右挪动,最后把保存的最后一个元素放到数组头部,代码步骤更少,理解成本更低。
  • 出错概率更低:不需要处理复杂的临时变量传递,循环范围更清晰(i > 0 即可覆盖所有需要右移的位置),不容易出现循环范围或逻辑方向的错误。

内容的提问来源于stack exchange,提问作者Mr.Frog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:36:13