这个题实际上思路是比较简单的,但是需要注意细节问题。
思路:读入数组之后进行排序,然后再求交、并、补集。
首先排序:(使用的是冒泡排序)
1 #include<iostream> 2 using namespace std; 3 int result1[1000]; 4 int result2[2000]; 5 int result3[1000]; 6 int k1 = 0; 7 int k2 = 0; 8 int k3 = 0; 9 void swap(int *a,int *b) 10 { 11 int temp = *a; 12 *a = *b; 13 *b = temp; 14 } 15 void sort(int a[],int n) 16 { 17 for(int i = 0; i < n; i++) 18 { 19 for(int j = 1; j < n-i; j++) 20 { 21 if(a[j]<a[j-1]) 22 swap(&a[j],&a[j-1]); 23 } 24 } 25 }
求交集:思路是将两个数组元素进行比较,如果有相同元素,就放到result1数组(结果数组)中。
代码如下:
1 void intersection(int a[],int b[],int n,int m)//求交集 2 { 3 int i = 0,j = 0; 4 while(1) 5 { 6 if(i==n||j==m) break; 7 else 8 { 9 if(a[i]<b[j]) 10 { 11 i++; 12 } 13 else if(a[i]==b[j]) 14 { 15 result1[k1++] = a[i]; 16 i++; 17 j++; 18 } 19 else 20 { 21 j++; 22 } 23 } 24 } 25 }
这个是对上面代码的简单解释。可能有点不清楚,如果大家有更好的思路,欢迎评论提出。
其实知道了交集的做法之后,并集和补集也就很清楚了。
并集:
1 void unions(int a[],int b[],int n,int m)//求并集 2 { 3 int i=0,j=0; 4 k2 = 0; 5 while(1) 6 { 7 if(i==n||j==m) break;//有一个数组结束,循环就结束 8 else 9 { 10 if(a[i]<b[j]) //遇到小的直接放入,因为我们本身就是从小到大过数组的,此时只移一个指针 11 { 12 result2[k2++] = a[i]; 13 i++; 14 } 15 else if(a[i]==b[j])//如果相等,我们只需要放一个就可以,两个数组指针同时后移 16 { 17 result2[k2++] = a[i]; 18 i++; 19 j++; 20 } 21 else 22 { 23 result2[k2++] = b[j]; 24 j++; 25 } 26 } 27 } 28 if(i<n)//因为存在数组长度不等的情况,我们需要再做别的操作。此时已经不需要比较 29 { 30 while(i!=n) 31 { 32 result2[k2++] = a[i]; 33 i++; 34 } 35 } 36 if(j<m)//同上 37 { 38 while(j!=m) 39 { 40 result2[k2++] = b[j]; 41 j++; 42 } 43 } 44 }
补集:
1 void complement(int a[],int n)//求b相对于a的补集 2 { 3 int i = 0; 4 int j = 0; 5 k3 = 0; 6 while(j<k1&&i<n)//二者缺一不可 7 { 8 if(a[i]!=result1[j]) 9 { 10 if(a[i]>result1[j])//自己测试的时候可能一个数组中有相同的元素,所以加了这个判断,不过题目似乎不用 11 { 12 j++; 13 } 14 else 15 { 16 result3[k3] = a[i]; 17 k3++; 18 i++; 19 } 20 } 21 else 22 { 23 i++; 24 } 25 } 26 while(i<n) 27 { 28 result3[k3++] = a[i]; 29 i++; 30 } 31 }
我在补集的时候,判断条件起初只写了一个j<k1,然后运行结果错误,后来发现问题,加以改正。
不足之处希望大家提出来,一起学习。个人觉得可能思路或者代码还是冗余比较多,不是那么精炼,求大神教!