我正在尝试找到两组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;
}
答案 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;
}