2017-04-10 9 views
0

이 질문을 게시하기 전에 내 문제와 관련된 질문을 확인했지만 유용하지 않은 항목을 확인했습니다. 정수 배열에서 중복 항목을 삭제하기 위해 병합 정렬 알고리즘을 수정하려고합니다. 불행히도, 내가 얻은 유일한 결과는 중복 된 엔트리가 0으로 대체 된 배열입니다.병합 정렬을 사용하여 배열의 중복 항목을 제거합니다.

Output:

내가 몇 가지 근본적인 지점을 놓치고 : 여기

public static int[] mergeSort(int[] array, int left, int right){ 
    int[] sortedArray = null; 
    if(left == right){ 
     sortedArray = new int[1]; 
     sortedArray[0] = array[left]; 
     return sortedArray; 
     } 

    int mid = (left+right)/2; 
    int[] subA = mergeSort(array, left, mid); 
    int[] subB = mergeSort(array, mid+1, right); 
    sortedArray = merge(subA, subB); 
    return sortedArray; 
} 

private static int[] merge(int[] subA, int[]subB){ 
    int[] mergedArray = new int[subA.length+subB.length]; 
    int i, j, k; 
    i = 0; 
    j = 0; 
    k = 0; 

    while(i < subA.length && j < subB.length){ 
     if(subA[i] < subB[j]){ 
      mergedArray[k] = subA[i]; 
      i++; 
     } 
     else if(subA[i] > subB[j]){ 
      mergedArray[k] = subB[j]; 
      j++; 
     } 
     //if the two elements are equal 
     else{ 
      mergedArray[k] = subA[i]; 
      i++; 
      j++; 
     } 
     k++; 
    } 

    if(j >= subB.length){ 
     while(i < subA.length){ 
      mergedArray[k] = subA[i]; 
      i++; 
      k++; 
     } 
    } 
    else{ 
     while(j < subB.length){ 
      mergedArray[k] = subB[j]; 
      j++; 
      k++; 
     } 
    } 

    return mergedArray; 
} 

위 코드의 출력? 이 제로 반복없이 고유 한 요소의 배열을 얻기 위해이 코드를 수정하는 효과적인 방법이 있습니까?

+0

0 값을 쓰지 않는 새 배열을 만드는 것이 왜 좋을까요? 감지 할 수있는 고유 요소의 수를 카운터 한 다음 새 배열이 얼마나 커야 하는지를 알 수 있습니다. –

+0

나는 또한 이런 식으로 생각했다. 불행히도 하나 이상의 0이 초기 배열의 요소 인 경우를 제외하지 않고 "올바른"0을 "잘못된"0과 구별하는 것이 불가능할 것이다. –

+0

하지만 어쨌든 0을 하나만 유지해야합니다. 맞습니까? 그래서 정렬이 끝나면 내용을 새로운 배열에 복사하고 요소가 음수 또는 경계가되기 전에 요소를 복사하고 양수 또는 경계 뒤에 요소 만 복사합니까? 그래도 원래 배열에 0이 있는지 여부를 추적해야하지만이 방법도 첫 번째 단계에서 수행 할 수 있습니다. –

답변

0

당신은

HashSet<T> uniqueElems = new HashSet<>(yourArrayList); 

을 할 수있는 그리고 요소 대신 모두 사용하여 배열을 올바르게

0

먼저 정의를 위해 당신은() 메소드를 귀하의 같음을 가정 다시 배열에

yourArrayList = new ArrayList<>(uniqueElems); 

원한다면 ArrayList 또는 다른 Collection의 코드는 그런 종류의 코드를 성공적으로 만들 수있는 유일한 방법입니다.

ArrayList<Integer> list = new ArrayList<>(); 
for (int i : mergedArray) 
     list.add(i); 

을 그리고 지금 return 문은 다음과 같이 표시됩니다 : - 모든 중복을 제거

return list.stream().distinct().mapToInt(i -> i).toArray(); 

별개의()를 어쨌든 여기 는이 문제를 해결하는 방법입니다.

mapToInt (i -> i) .toArray() - ArrayList를 다시 배열로 만듭니다.