java - 为什么这段代码显示 StackOverflow 错误?
问题描述
import java.util.Arrays;
import java.util.Scanner;
public class EqualMedian {
static int median(int[] a, int[] b, int mid, int[] temp) {
int count = 0;
if (a[mid] != b[mid]) {
temp[0] = a[mid];
a[mid] = b[mid];
b[mid] = temp[0];
Arrays.sort(a);
Arrays.sort(b);
count++;
median(a, b, mid, temp);
}
return count;
}
public static void main(String args[]) throws Exception {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for (int j = 0; j < t; j++) {
int n = sc.nextInt();
int a[] = new int[n];
int b[] = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = sc.nextInt();
}
int[] temp = { 0 };
int mid = (n / 2) + 1;
int ans = median(a, b, mid, temp);
System.out.println(ans);
}
}
}
输出:执行失败。堆栈跟踪:Equal_median.median(Equal_median) 处 java.util.Arrays.sort(Arrays.java:144) 处 java.util.DualPivotQuicksort.sort(DualPivotQuicksort.java:111) 处的线程“主”java.lang.StackOverflowError 中的异常.java:16) 在 Equal_median.median(Equal_median.java:19) Equal_median.median(Equal_median.java:19) 在 Equal_median.median(Equal_median.java:19)
解决方案
所以你的最终目标是确定 2 个数组的中位数是否相等,如果是,打印中位数?您应该创建一种仅计算一个数组的中位数的方法。为 main 中的每个数组调用此方法。不需要递归。
public static int median(int []myArray) {
int mid = (myArray.length() / 2) + 1;
return myArray[mid]
}
public static void main(String args[]) {
...
int firstMedian = median(a);
int secondMedian = median(b);
if(firstMedian == secondMedian) {
System.out.println(firstMedian);
}
}
如果没有设置适当的结束条件,则不应使用递归。所以..总是仔细检查你的状况。大多数递归都有等效的 for/while 循环。如果 while 循环中的条件听起来像是无穷大,那可能是个坏主意。
此外,如果一个变量可以在本地计算并且在方法之后没有任何用途(例如temp
),请不要将其作为参数!只需在本地声明即可。
推荐阅读
- python - DP方法计算珠子的最大长度
- optimizely - 代码片段可在控制台上通过 Injector 工作,但不能通过 Optimizely
- c# - 自定义 ValidationAttribute 返回 Exception 而不是 ValidationMessage
- python-3.x - ValueError:错误的项目数通过了 9,当在 Pandas 中将计算结果设置为一列值时,位置意味着 1 或 NaN
- google-apps-script - getNextDataCell - 未定义方向
- excel - 从存储在 Excel 中的员工 ID 获取电子邮件地址
- javascript - 如何制作 React 原生路由
- python - 在集合中添加项目(Python)
- android - 应用程序在华为设备上中断时本地通知不起作用 [Xamarin.Android]
- javascript - Provide onclick dynamically and avoid duplicate event calling