【发布时间】:2020-09-12 08:21:20
【问题描述】:
给定一个数组,我必须在其中通过递归打印数组中重复给定元素的第一个索引 和二分搜索,但对于像数组 [0] 这样的极端情况,它会抛出异常 ArrayIsOutOfBound。这在每个解决方案中都会发生,即使我必须通过递归和对 array.length 处的元素的二进制搜索找到重复给定元素的最后一个索引 -
- 为什么?以及如何摆脱这种情况?
查找最后一个索引-
输入:
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