【问题标题】:Java Find Closest Pair Based on Sum is ArrayIndexOutOfBoundsException [duplicate]Java基于总和查找最接近的对是ArrayIndexOutOfBoundsException [重复]
【发布时间】: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 - 哦,我看错了 - 谢谢!顺便说一句,我确实使用了调试器并进行了单元测试。

标签: java arrays algorithm


【解决方案1】:

想出了解决办法:

 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) {

        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;
}

【讨论】:

  • 不要在回答中提问。创建一个新问题来问这些问题。
  • 但是问问自己为什么[10, 22] 不是sum = -10 的正确答案。这是你能得到的最接近的。 --- 问问自己,如果arr == null,为什么NullPointerException 不正确。 --- 问问自己如果arr.length 是 0 或 1,返回值应该是多少。为什么不IllegalArgumentException?现在您的代码返回[0, 0]糟糕!
  • 您的代码似乎假设输入数组已排序。尚未在任何地方指定。
  • Andreas - 抱歉在已回答的问题中创建一个新问题...将创建一个新问题来询问这些问题。已从我提供的答案中删除它们。感谢您的影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多