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

数组逆时针旋转代码抛出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:37:30