打印出数组中重复数字的位置

时间:2015-01-24 07:54:11

标签: java arrays search duplicates

所以我正在编写一个二进制搜索方法来查找给定数字的数组中的位置。回到那个位置。所以每次我将数组中的数字与我搜索的数字进行比较时,打印出数组中的位置和该位置的数字。到目前为止,她是我的代码:

public static int binSearch(int[] arr, int key) {
    int lo = 0;
    int hi = array.length - 1;
    while (lo <= hi) {
        int mid = lo + (hi - lo) / 2;
        if (key < arr[mid]) { 
           hi = mid - 1;
        } else if (key > arr[mid]) {
           lo = mid + 1;
        }
        else {
           return mid;
        }
    }
    return -1;
}

public static void main(String[] arg) {

    int[] array = new int[] { 0, 1, 2, 2, 2, 3, 3, 4};

    for ( int i = 0; i < array.length; i++ ) {
        int index = Arrays.binarySearch(array, i);
        System.out.println(array[i] + " at " + index);
    }
}

输出:

 0 at 0
 1 at 1
 2 at 2
 2 at 5
 2 at 8
 3 at 9
 3 at 10
 4 at -12
 4 at 11

我的预期输出是

 0 at 0
 1 at 1
 2 at 2
 2 at 3
 2 at 4
 3 at 5
 3 at 6
 4 at 7
 4 at 8

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您正在将index而不是element传递给二进制搜索功能。

试试这个

for ( int i = 0; i < array.length; i++ ) {
    int index = binarySearch(array, array[i]);
    System.out.println(array[i] + " at " + index);
}

您的二进制搜索功能也存在一些问题..

这是一个经过纠正的

static int binarySearch(int[] arr, int key) { //Changed name to match with calling function name
int lo = 0;
int hi = arr.length - 1; //not array.length
while (lo <= hi) {

    int mid = lo + (hi - lo) / 2;
    if (key < arr[mid]) { 
       hi = mid - 1;
    } else if (key > arr[mid]) 
       lo = mid + 1;
    // you had one } here
    else return mid;
 }
 return -1;
}

这会产生输出

0 at 0
1 at 1
2 at 3
2 at 3
2 at 3
3 at 5
3 at 5
4 at 7

如上所述,使用binary search生成输出有什么用?要获得您提到的输出,可以使用linear search

答案 1 :(得分:0)

如果按照Arrays.binarySearch方法的要求对array进行排序,则第一项的索引很容易找到:

int index= Arrays.binarySearch(array, value);

否定结果表明value不在array。现在,如果发现 并且您对其他索引感兴趣,则可以直接遍历该数组,直到该值不再匹配为止:

public static void printIndexes(int[] array, int value){
  int index= Arrays.binarySearch(array, value);
  if (index < 0){
    return; // value not in array
  }
  while (index < array.length && array[index]==value){
    System.out.println(value + " at " + index);
    index++;
  }
}