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

填充整数数组时触发ArrayIndexOutOfBoundsException问题求助

解决你的ArrayIndexOutOfBoundsException问题

嘿,我看你在尝试用迭代填充整数数组时碰到了数组越界异常,咱们来一步步拆解问题,搞定它!

首先,异常的核心原因:你的steps数组长度是1000001,所以合法索引只能到1000000。但内层循环里mult = current*m这个计算很容易超界——比如当current是1001的时候,m取1001的话,1001*1001=1002001,直接超过了数组的最大索引,这时候访问steps[mult]肯定会炸。而且不止这个情况,哪怕current是500000,m取3的话,500000*3=1500000也超界了,之前的判断没拦住所有风险。

另外你的代码还有个逻辑漏洞:外层循环从i=1001开始,那3到1000的steps值都是初始的0,你后面判断if(steps[i]==0)才赋值,但这些位置根本没被处理过,逻辑完全走不通啊!

修复后的代码示例:

import java.util.Scanner;

public class StepCalculator {
    public static void main(String[] args) {
        final int MAX_SIZE = 1000001;
        int[] steps = new int[MAX_SIZE];
        
        // 初始化已知的步数
        steps[0] = 0;
        steps[1] = 1;
        steps[2] = 2;
        
        // 先给所有数赋一个默认步数:通过前一个数+1到达
        for (int i = 3; i < MAX_SIZE; i++) {
            steps[i] = steps[i-1] + 1;
        }
        
        // 遍历每个数,尝试通过乘法的方式更新更小的步数
        for (int i = 2; i < MAX_SIZE; i++) {
            int current = i;
            // 从m=2开始乘,一旦乘积超数组范围就停止
            for (int m = 2; ; m++) {
                int mult = current * m;
                if (mult >= MAX_SIZE) {
                    break; // 超范围就别继续算了,避免越界
                }
                int possibleStep = steps[current] + 1;
                // 如果通过乘法得到的步数比当前记录的更小,就更新
                if (possibleStep < steps[mult]) {
                    steps[mult] = possibleStep;
                }
            }
        }
        
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入要查询的数字n: ");
        int n = scan.nextInt();
        if (n >= 0 && n < MAX_SIZE) {
            System.out.printf("到达数字%d的最少步数是: %d%n", n, steps[n]);
        } else {
            System.out.println("输入的数字超出范围啦,请输入0到1000000之间的数");
        }
        scan.close();
    }
}

修复点说明:

  1. 彻底避免越界:内层循环从m=2开始(m=1的话乘积就是current本身,没必要处理),并且一旦计算出的mult超过数组最大索引,直接break终止内层循环,从根源上杜绝越界。
  2. 补全初始逻辑:先通过循环给3到1000000的所有位置赋默认步数,确保每个位置都有初始值,不会出现未初始化的0干扰判断。
  3. 优化步数更新:只有当通过乘法得到的新步数比当前记录的步数更小时,才更新数组值,避免无效操作,提升效率。

这样改完之后,不仅解决了数组越界的问题,你的步数计算逻辑也能正常跑起来啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:09:54