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
相关产品推荐
相关产品推荐

