这是我目前的搜索方法:
public static int search(int[] array, int numero) {
int start = 0;
int end = array.length - 1;
int center;
while (start <= end) {
center = (start + end) / 2;
if (array[center] == numero) {
return center;
} else if (array[center] < numero) {
start = center + 1;
} else {
end = center - 1;
}
}
return -1;
}
它会从用户输入numero
搜索到以前在
我想弄清楚的是如何打印阵列中发现的所有巧合,而不仅仅是找到的第一个巧合。 我正在考虑将结果添加到List然后将其返回到Main,但是当我尝试在找到的第一个结果时发生了无限循环,导致它反复添加到List中,直到程序崩溃。
答案 0 :(得分:1)
假设您了解二进制搜索背后的基本理论,请将其分为3个步骤。
使用二进制搜索方法搜索。
找到匹配后,从该点向上扫描,直至找到不匹配的元素。
向下扫描,添加到结果列表,直到找到非结果列表 匹配元素。
如果您不需要关心事件发生顺序,可以将步骤2和3结合起来,然后向上扫描添加到列表中,然后向下扫描添加到列表中,因为由于排序,您点击的所有内容都得到保证匹配,直到它没有。
如果 关心事件发生顺序,可以通过跳转和检查来编写步骤2,并编写修改后的二进制搜索,以搜索匹配/不匹配而不是匹配的转换。
这可以通过保持统计或分析,找到完美的跳跃距离,或基于最后一次检查来进一步优化。
答案 1 :(得分:0)
实际上这很容易,因为列表已经排序,您希望找到的数字是相邻的。
就像Ryan的回答一样,我会提供一些代码
public static List<Integer> searchAll (int[] array, int numero){
int firstMatchIndex = search( array, numero);
List<Integer> results = new ArrayList<Integer>():
results.add(firstMatchIndex);
boolean left = true;
while( left){
int i = firstMatchIndex - 1;
if(i<0 || array[i] != numero){
left = false;
}else{
results.add(i);
}
}
boolean right = true;
while( right){
int i = firstMatchIndex + 1;
if(i>array.length || array[i] != numero){
right = false;
}else{
results.add(i);
}
}
}