找到两组10位数字的并集

时间:2014-10-22 01:27:00

标签: c

我正在尝试找到两组10位数字的并集,我传递了三个int数组:第一个,第二个和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;
}

3 个答案:

答案 0 :(得分:6)

第一个好的步骤(几乎)总是排序。

对两个输入集进行排序(除非您知道它们已经排序)。

然后一次迭代两个(两个索引),只将这些元素添加到满足您标准的输出中(似乎是联合减去交集,因此只有一个)。

奖励:输出集将被排序。

答案 1 :(得分:3)

我建议您先编写一个contains(int[], int)方法,例如

#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;
}

然后,您可以使用类似

的方法实现compound方法
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;
}

最后,您可以像

一样进行测试
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

答案 2 :(得分: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;
}