【问题标题】:My solution throwing exception with corner cases?我的解决方案在极端情况下抛出异常?
【发布时间】:2020-09-12 08:21:20
【问题描述】:

给定一个数组,我必须在其中通过递归打印数组中重复给定元素的第一个索引 和二分搜索,但对于像数组 [0] 这样的极端情况,它会抛出异常 ArrayIsOutOfBound。这在每个解决方案中都会发生,即使我必须通过递归和对 array.length 处的元素的二进制搜索找到重复给定元素的最后一个索引 -

  1. 为什么?以及如何摆脱这种情况?

查找最后一个索引-

输入:

int[] array = {5, 10, 10, 10, 10, 20, 20} 

int X = 20;

输出应该是:

6

我的输出抛出异常。

我的解决办法是:

public static void main(String[] args) {

    int[] arr = {5, 10, 10, 10, 10, 20, 20};
    int X = 20;
    System.out.println(lastOcc(arr, 0, arr.length - 1, X));
}
public static int lastOcc(int[] arr, int low, int high, int X) {
    if(low > high){
        return -1;
    }
    int mid = low + high / 2;

    if(arr[mid] == X) {
        if (mid == arr.length - 1 || arr[mid] != arr[mid + 1]) {
            return mid;
        } else
            return lastOcc(arr,mid + 1, high, X);
    } else if (arr[mid] > X) {
        return lastOcc(arr, low, mid - 1, X);
    } else
        return lastOcc(arr, mid + 1, high, X);
}

找到第一个索引-

输入:

int[] arr = {10, 20, 20, 30, 40, 50, 60}

int X = 10;

输出应该是:

0

但它正在抛出异常

我的解决方案是:

public static void main(String[] args) {    
        int[] arr = {10, 20, 20, 30, 40, 50, 60};    
        int x = 10;
        System.out.println(firstOcc(arr, 0, arr.length - 1, x));    
    }

 public static int firstOcc(int[] arr, int low, int high, int x){

        if(low > high){    
            return -1;    
        }

        int mid = low + high / 2;

        if(arr[mid] == x){    
            if(arr[mid  - 1] != arr[mid] || mid == 0){    
                return mid;    
            } else
               return firstOcc(arr, low, mid - 1, x);
        }

        if(x > arr[mid]){    
            return firstOcc(arr, mid + 1, high, x);    
        } else    
            return firstOcc(arr, low, mid - 1, x);    
    }

【问题讨论】:

  • 还有什么例外?关注哪条线?

标签: java arrays recursion binary-search


【解决方案1】:

对于这个例子,你只需要添加括号

int mid = (low + high) / 2;

作为

除法在加法之前执行

而且在“第一次发生”变化中

 if(arr[mid  - 1] != arr[mid] || mid == 0)  to

 if(mid == 0 || arr[mid  - 1] != arr[mid] )

因为这将忽略 X=5 的异常

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多