数组逆时针旋转代码抛出ArrayIndexOutOfBoundsException问题排查
问题分析与修复
异常根因
异常提示Index 47 out of bounds for length 47,说明实际传入的数组arr长度为47,但参数n被错误传成了77。代码中第一个循环j从0遍历到d-1=68,当j到达47时,数组arr的最大合法索引是46,因此触发数组越界异常。
同时代码本身存在两个关键逻辑问题:
- 未处理
d >= n的情况:如果d大于等于数组长度n,旋转d个元素等价于旋转d%n个元素,不处理的话当d>n时会直接触发越界。 - 使用
PriorityQueue错误:PriorityQueue会自动对元素排序,导致前d个元素的原始顺序被打乱,无法实现正确的数组旋转,应该用保持插入顺序的队列(如LinkedList)。
修复后的代码
class Solution { //Function to rotate an array by d elements in counter-clockwise direction. static void rotateArr(int arr[], int d, int n) { // 处理无需旋转的情况 if (d == 0 || n <= 1) { return; } // 当d大于n时,取模简化旋转次数 d = d % n; // 使用LinkedList保持元素插入顺序,替代PriorityQueue Queue<Integer> buffer = new LinkedList<>(); // 暂存前d个元素 for(int j = 0; j < d; j++) { buffer.offer(arr[j]); } // 移动后续元素到数组前端 for(int i = 0 ; i < n; i++) { if(i < n - d) { arr[i] = arr[i + d]; } else { arr[i] = buffer.poll(); } } } }
额外注意事项
- 调用
rotateArr时必须保证参数n严格等于arr.length,避免参数不匹配导致的异常。 LinkedList实现了Queue接口,能严格按照插入顺序取出元素,完全符合数组旋转对元素顺序的要求;而PriorityQueue是优先级排序队列,不适合需要保留原始顺序的场景。
内容的提问来源于stack exchange,提问作者Konrad Kos1
相关产品推荐
相关产品推荐

