У меня довольно большой int [], который сортируется с использованием Arrays.sort()
.. Мне нужно удалить повторяющиеся элементы из массива.Удаление дубликатов из отсортированного int [] с использованием binarysearch
Этот вопрос возникает из алгоритмов книги Седжвика 1.1.28
1.1.28 Удалить дубликаты. Измените тестовый клиент в BinarySearch, чтобы удалить любые удаленные ключи в белом списке после сортировки.
Я попытался создать метод с noDupes(), который принимает в межд [] и возвращает INT [] с дубликатами удалены
ранг() методы из code.which Седжвика делает бинарный поиск
public static int[] noDupes(int[] a){
Arrays.sort(a);
int maxval= a[a.length-1];
int[] nodupes = new int[maxval];
int i=0;
for(int j=0;j<a.length;j++){
int rnk = rank(a[j],nodupes);
System.out.println(a[j]+" rank="+rnk);
if (rnk < 0){
System.out.println(a[j]+" is not dupe");
nodupes[i] = a[j];
i++;
}
}
return nodupes;
}
public static int rank(int key,int[] a){
return rank(key,a,0,a.length-1);
}
public static int rank(int key,int[] a,int lo,int hi){
if(lo > hi) return -1;
int mid = lo+(hi-lo)/2;
if(key < a[mid])return rank(key,a,0,mid-1);
else if(key > a[mid])return rank(key,a,mid+1,hi);
else return mid;
}
Когда я побежал это с массивом образца
int[] a =new int[]{2,2,2,3,4,4,5,6};
int[] ret = noDupes(a);
Я получаю неожиданную output..even AFTE г 2 добавляется в массив nodupes, ранг для существующего элемента -1 ..
2 rank=-1
2 is not dupe
2 rank=-1
2 is not dupe
2 rank=-1
2 is not dupe
3 rank=-1
3 is not dupe
4 rank=-1
4 is not dupe
4 rank=4
5 rank=-1
5 is not dupe
6 rank=-1
6 is not dupe
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at ...noDupes(BinSearch.java:85)
at ...main(BinSearch.java:96)
Я не мог понять, что я делаю wrong..can кто-то помочь?
Почему вы не можете использовать 'Set'? –
sanbhat
@sanbhat - потому что это не то, о чем идет речь. –
Я пытаюсь научиться делать это без использования каких-либо классов библиотеки.Я думаю, что упражнение означает решить это с помощью binarysearch – damon