当给定数组(按升序排列)或整数时,我想以有效的方式在数组中找到整数。我检查数组的中间数字是否等于要检查的数字。如果是的话,太好了!如果没有,那么我检查数字是否大于或小于中间数字。我将阵列切成两半并再次检查。但是,我一直得到零值。
public static int findNumber(int[] array, int number){
int position = 0;
int half = array.length/2;
//System.out.println(array[half]);
if (array[half]==number){
position=array.length/2;
}
else if (array[half]<number){
findNumber(Arrays.copyOfRange(array, half, array.length),number);
}
else if (array[half]>number){
findNumber(Arrays.copyOfRange(array,0,array.length/2),number);
}
return position;
}
唯一的例外是,如果检查的数字是数组的确切中间数。我认为错误与我无法理解Arrays.copyOfRange(original,to:,from :)的工作原理。
答案 0 :(得分:0)
根据java.util文档Arrays.copyOfRange:
将指定数组的指定范围复制到新数组
在每次递归调用中,您将获得一个新数组,其中搜索项的位置将与原始数组不同。
答案 1 :(得分:0)
您需要添加一个值,以跟踪传递回方法的范围左侧有多少索引。
public static int findNumber(int[] array, int number){
return(helper(array, number, 0);
}
public static int helper(int[] array, int number, int leftOf){
int half = array.length/2;
//System.out.println(array[half]);
if (array[half]==number){
return(half+leftOf);
}
else if (array[half]<number){
return(
helper(Arrays.copyOfRange(array, half, array.length),number,leftOf+half));
}
else if (array[half]>number){
return(
helper(Arrays.copyOfRange(array,0,array.length/2),number,leftOf));
}
}