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

Java计算数组跨度(最大值减最小值)代码运行异常求助

问题排查与代码修正

存在的错误点

  • 数组输入循环越界:数组长度为n时合法下标范围是0 ~ n-1,原代码中输入循环写i<=n,会直接触发数组下标越界异常。
  • 排序函数循环逻辑错误:smler和grter函数的原循环写为for (int i=0;i<=j;j++),循环控制变量是i但每次自增的是参数j,会导致死循环+数组越界;同时遍历中需要访问i+1位置的元素,循环上限应为j-2,即循环条件改为i < j-1,增量改为i++。
  • 结果读取越界:原代码调用排序函数后读取arr[n],超出数组合法下标范围,应改为arr[n-1]。

修正后可运行代码

import java.io.*;
import java.util.*;

public class Main{

    public static void smler(int arr[],int j){
        for (int i=0;i<j-1;i++){
            if(arr[i]<arr[i+1]){
                int temp =arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
    }
    public static void grter(int arr[],int j){
        for (int i=0;i<j-1;i++){
            if(arr[i]>arr[i+1]){
                int temp =arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
    }
    public static void main(String[] args) throws Exception {
        Scanner sc= new Scanner (System.in);
        int n=sc.nextInt();
        int[] arr= new int[n];
        for(int i=0;i<n;i++){
            arr[i]=sc.nextInt();
        }
        grter(arr,n);
        int y= arr[n-1];
        smler(arr,n);
        int z = arr[n-1];
        System.out.println(y-z);
    }
}

优化建议

不需要两次遍历数组分别求最大最小值,单次遍历即可同时拿到最大值和最小值,执行效率更高,示例逻辑如下:

int max = arr[0], min = arr[0];
for(int num : arr) {
    if(num > max) max = num;
    if(num < min) min = num;
}
int span = max - min;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:39:03