【发布时间】:2020-03-24 22:28:28
【问题描述】:
我试图根据 sum 找到最接近的对,但得到一个
java.lang.ArrayIndexOutOfBoundsException: -1
Find a pair in array whose sum is closest to sum.
e.g.
Input: arr[] = {10, 22, 28, 29, 30, 40}, sum = 54
Output: 22 and 30
我的解决方案:
import java.util.Arrays;
public class ArrayUtils {
public static int[] closestPairBasedOnSum(int[] arr, int sum) {
if (arr == null) {
return null;
}
if (sum < 1) {
return null;
}
int[] closestPair = new int[2];
int left = 0;
int right = arr.length - 1;
int diff = Integer.MAX_VALUE;
while (right > left) {
// this if is throwing the ArrayIndexOutOfBoundsException
if (Math.abs(arr[left] + arr[right] - sum) < diff) {
closestPair[0] = arr[left];
closestPair[1] = arr[right];
diff = Math.abs(arr[left] + arr[right] - sum);
}
if (arr[left] + arr[right] > sum) {
right--;
}
else {
left--;
}
}
System.out.println(Arrays.toString(closestPair));
return closestPair;
}
public static void main(String[] args) {
int [] arr = new int[] {10, 22, 28, 29, 30, 40};
int[] closestPair = ArrayUtils.closestPairBasedOnSum(arr, 54);
System.out.println(Arrays.toString(closestPair));
}
}
输出:
java.lang.ArrayIndexOutOfBoundsException: -1
为什么不返回[22, 30]?
【问题讨论】:
-
仅供参考:“编码难题”与“学校作业”没有区别。这是您“选择”去做的练习,无论该选择是否直接自愿。就 StackOverflow 的问题而言,“学校作业”、“练习”、“考试”、“测试”、“拼图”、“面试题”、“挑战”等都是一样的,它们都是 您应该完成,以表明您知道自己在做什么,无论是展示他人还是展示自己。
-
既然您是在测试自己,那么您也应该尽可能多地尝试找出问题所在,尤其是您应该自己调试代码,而不是要求我们调试它给你。似乎没有尝试调试,所以现在是您学习/自学如何调试的好时机。 What is a debugger and how can it help me diagnose problems?
-
编辑了我的帖子并为我的计算添加了一个
diff变量。 -
你初始化
left = 0,然后有left--,你很困惑你得到left = -1导致ArrayIndexOutOfBoundsException: -1? --- 提示: 调试会告诉你left是-1,这显然是不正确的,所以调试会直接导致你不正确的@987654334 @bug,不用问我们。 -
@Andreas - 哦,我看错了 - 谢谢!顺便说一句,我确实使用了调试器并进行了单元测试。