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

Java实现ArrayList指定位置M后反转数组报IndexOutOfBoundsException

异常原因分析
  • 直接触发越界的问题点:代码最后一个遍历赋值的循环里,错误使用了外层变量i作为索引:
    前两个循环执行完成后,i已经被累加到等于数组长度n(测试用例中数组长度为6),而ArrayList的合法索引范围是0 ~ n-1,用i=6调用arr.set()和reverseArray.get()时直接触发越界,和你收到的报错信息完全吻合。
  • 额外逻辑错误:反转部分的循环中p变量没有自增,会导致反转后的元素全部等于原数组最后一个元素,即使修复索引问题也无法实现预期的反转效果。
修复方案

方案1:基于原有逻辑修改

仅修正存在问题的变量,保留你原本的实现思路:

import java.util.ArrayList;
public class Solution 
{
    public static void reverseArray(ArrayList<Integer> arr, int m)
    {
        int i=0,p=1;
        int n=arr.size();
        ArrayList<Integer> reverseArray=new ArrayList<Integer>();
        for(int j=0;j<n;j++){
            reverseArray.add(0);
        }
        for(;i<=m;i++){
            reverseArray.set(i, arr.get(i));
        }
        for(;i<n;i++){
            reverseArray.set(i,arr.get(n-p));
            p++; // 新增p自增逻辑,每次取原数组更靠前的元素
        }
        // 把循环索引变量从i改为j
        for(int j=0;j<n;j++){
            arr.set(j,reverseArray.get(j));
        }
    }
}

方案2:更高效的原地双指针实现(推荐)

无需额外开辟数组空间,时间复杂度O(n),空间复杂度O(1),性能更优:

import java.util.ArrayList;
public class Solution 
{
    public static void reverseArray(ArrayList<Integer> arr, int m)
    {
        int left = m + 1;
        int right = arr.size() - 1;
        while(left < right) {
            // 交换左右指针位置的元素
            int temp = arr.get(left);
            arr.set(left, arr.get(right));
            arr.set(right, temp);
            left++;
            right--;
        }
    }
}

内容的提问来源于stack exchange,提问作者Anandhakrishnan Pillai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:27:03