蓝桥杯_算法训练_ALGO10_集合运算

  这个题实际上思路是比较简单的,但是需要注意细节问题。

  思路:读入数组之后进行排序,然后再求交、并、补集。

  首先排序:(使用的是冒泡排序)

 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,然后运行结果错误,后来发现问题,加以改正。

 不足之处希望大家提出来,一起学习。个人觉得可能思路或者代码还是冗余比较多,不是那么精炼,求大神教!

posted on 2017-08-17 13:48  宋田茹  阅读(555)  评论(0编辑  收藏  举报