3 回答
TA贡献1798条经验 获得超7个赞
由于数组已排序,因此您要在数组的中间寻找一个切片。因此,您需要找到数组中最低界限的位置,然后找到上限的相同位置(从末尾开始)。这些位置之间的数组元素是结果数组。
您基本上在开始和结束时都截去了不需要的数字:
int[] arr = new int[]{1, 1, 3, 3, 4, 6, 7, 7, 8, 10};
int low=2;
int up=7;
int lowIdx=0;
int upIdx=arr.length-1;
for(int i=0;i<arr.length;i++){
lowIdx = i;
if(arr[i] >= low){
break;
}
}
for(int i = arr.length-1;i>=0;i--){
if(arr[i] <= up){
break;
}
upIdx = i;
}
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, lowIdx, upIdx)));
印刷 [3, 3, 4, 6, 7, 7]
这容易吗?并不真地。它是稍微复杂的代码,它利用了数组已排序的事实。
TA贡献1951条经验 获得超3个赞
最简单的方法是:
int[] arr = {1, 1, 3, 3, 4, 6, 7, 7, 8, 10};
int min = 2;
int max = 7;
int[] result = IntStream.of(arr).filter(x -> x >= min && x <= max).toArray();
这样做的另一种方法(在许多情况下比binarysearch需要遍历整个数组来找到最后一个索引要快)是使用一个循环,该过程只需要遍历一半的元素,并进行两次查找pr。循环周期:
int minIndex = arr.length;
int maxIndex = 0;
for(int i = 0; i < arr.length / 2; i++)
{
if(arr[i] >= min && i < minIndex)
minIndex = i;
int j = arr.length-i-1;
if(arr[j] <= max && j > maxIndex)
maxIndex = j;
}
int[] res = Arrays.copyOfRange(arr,minIndex,maxIndex+1);
添加回答
举报