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

