2014-10-22 3 views
1

2 자리 10 자리 숫자의 합집합을 찾으려고합니다. 세 번째 int 배열을 따라 전달합니다 : first, second 및 comp (이것은 결합을 유지합니다. 세트).두 자리 숫자의 합집합을 찾습니다.

지금까지 한 어레이에 첫 번째와 두 번째를 추가했습니다. comp []에서 일치하는 인덱스를 찾은 다음 필터를 삭제하려고 생각했습니다. 훨씬 쉬운 방법이 있다고 생각합니다. 아무도 내게 힌트를 줄 수 있습니까?

는 기본적으로 나는
first[] = [1,2,3,4,5,6,7,8,9,10]; 
second[] = [1,2,3,4,11,12,13,14,15,16]; 

을 가지고 그리고 난 반드시 순서대로되지 않습니다

comp[] = [5,6,7,8,9,10,11,12,13,14,15,16]; 

숫자를 반환합니다.

int compound(int first[],int second[],int comp[]){ 
int i=0; 
int indicies[20]; 
for(int j = 0; j<SIZE; j++){ 
    comp[i]=first[j]; 
    i++; 
} 

for(int k = 0; k<SIZE; k++){ 
    comp[i]=second[k]; 
    i++; 
} 
int z=0; 
for(int l = 0; l<SIZE*2; l++){ 
    for(int m = 0; m<SIZE*2; m++){ 
     if(comp[l]==comp[m]){ 
      indicies[z]=m; 
      z++; 
     }}} 


return 0; 
} 
+0

이되지 않습니다 그 조합을 뺀 교차? – Tommy

+0

* [해시 테이블] (https://en.wikipedia.org/wiki/Hash_table) * 개념에 익숙하십니까? – ruakh

+0

결과가 얼마나 큰지를 어떻게 전달하고 싶습니까? – Deduplicator

답변

6

첫 번째 단계는 항상 거의 항상 정렬입니다.

두 개의 입력 세트를 정렬합니다 (이미 정렬되어 있지 않은 경우).

그런 다음 한 번에 두 개의 인덱스를 반복하고 조건을 충족하는 출력에 해당 요소를 추가하십시오 (즉, 빼기 교차로이므로 하나만 있음).

보너스 : 출력 세트가 정렬됩니다.

3

난 당신이

처럼 테스트 할 수 있습니다, 당신이 마지막으로

int compound(int first[],int second[],int comp[]){ 
    int i=0; 
    int j; 
    for(j = 0; first[j] != '\0'; j++){ 
    int val = first[j]; 
    if (contains(second, val) && !contains(comp, val)) 
     comp[i++] = val; 
    } 
    return i; 
} 

같은 것을 함께 사용 그런 다음 compound 방법이 구현 될 수

#include <stdio.h> 
#include <stdbool.h> 

bool contains(int arr[], int val) { 
    int offset; 
    for (offset = 0; arr[offset] != '\0'; offset++) { 
    if (arr[offset] == val) return true; 
    } 
    return false; 
} 

같은 contains(int[], int) 방법을 작성하여 시작하는 것이 좋습니다

int main(int argc, char *args[]) { 
    int a[] = {1,2,3,'\0'}; 
    int b[] = {2,3,4,'\0'}; 
    int c[3]; 
    int count = compound(a,b,c); 
    int i; 
    for (i = 0; i < count; i++) { 
    printf("%i\n", c[i]); 
    } 
} 

출력은

입니다.
2 
3 
+0

'c' 배열이 너무 작아서'1,2,3,4' 결과를 저장할 수 없습니다. – ooga

+0

아름다운. 고마워. –

+0

은 C99의 기능인 stdbool.h가 아닙니까? 그렇다면'for'의 첫 번째 매개 변수에서'offset'을 선언 할 수 있습니다 ... – Jack

1

숫자 범위가 작은 경우 당신이 할 수있는 :

#include <stdio.h> 

#define MAX 20 // small numeric range 

#define sz(a) (sizeof(a)/sizeof(*(a))) 

int xunion(int *a, int sa, int *b, int sb, int *c) { 
    int n[MAX] = {0}; 
    for (int i=0; i<sa; i++) n[a[i]] = 1; 
    for (int i=0; i<sb; i++) n[b[i]] = 1; 
    int j=0; 
    for (int i=0; i<MAX; i++) if (n[i]) c[j++] = i; 
    return j; 
} 

void prn(int *a, int s) { 
    while (s-- > 0) printf("%d ", *a++); 
    putchar('\n'); 
} 

int main() { 
    int a[] = {6, 3, 4, 7, 5}; 
    int b[] = {2, 4, 5, 7, 6, 3}; 
    int c[MAX]; 
    prn(a, sz(a)); 
    prn(b, sz(b)); 
    int n = xunion(a, sz(a), b, sz(b), c); 
    prn(c, n); 
    return 0; 
} 
+0

나는 여기서 무슨 일이 일어나는지 전혀 모른다. haha –

+0

@BillTudor 배열'n'은 0으로 초기화됩니다. 두 입력 배열은 모두 반복되며, 'n'의 해당 요소를 1로 설정합니다. 그러면 'n'이 반복되고 1이있는 곳에서 인덱스는 원래 목록에있는 숫자 중 하나이므로 출력 배열에 추가됩니다 . 'n'은 바이트 배열 또는 비트 배열 일 수 있습니다. – ooga

관련 문제