我的解决方案在极端情况下抛出异常?

My solution throwing exception with corner cases?

给定一个数组,其中我必须通过递归打印数组中重复给定元素的第一个索引 和二进制搜索,但对于像 array[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);    
    }

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

int mid = (low + high) / 2;

作为

Division is performing prior to addition

并且还在“FirstOccurrence”中更改

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

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

因为这将忽略 X=5

的异常