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

时间:2023-03-09 03:19:05
蓝桥杯_算法训练_ALGO10_集合运算

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

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

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

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

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

 #include<iostream>
using namespace std;
int result1[];
int result2[];
int result3[];
int k1 = ;
int k2 = ;
int k3 = ;
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void sort(int a[],int n)
{
for(int i = ; i < n; i++)
{
for(int j = ; j < n-i; j++)
{
if(a[j]<a[j-])
swap(&a[j],&a[j-]);
}
}
}

求交集:思路是将两个数组元素进行比较,如果有相同元素,就放到result1数组(结果数组)中。

代码如下:

 void intersection(int a[],int b[],int n,int m)//求交集
{
int i = ,j = ;
while()
{
if(i==n||j==m) break;
else
{
if(a[i]<b[j])
{
i++;
}
else if(a[i]==b[j])
{
result1[k1++] = a[i];
i++;
j++;
}
else
{
j++;
}
}
}
}

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

这个是对上面代码的简单解释。可能有点不清楚,如果大家有更好的思路,欢迎评论提出。

其实知道了交集的做法之后,并集和补集也就很清楚了。

并集:

 void unions(int a[],int b[],int n,int m)//求并集
{
int i=,j=;
k2 = ;
while()
{
if(i==n||j==m) break;//有一个数组结束,循环就结束
else
{
if(a[i]<b[j]) //遇到小的直接放入,因为我们本身就是从小到大过数组的,此时只移一个指针
{
result2[k2++] = a[i];
i++;
}
else if(a[i]==b[j])//如果相等,我们只需要放一个就可以,两个数组指针同时后移
{
result2[k2++] = a[i];
i++;
j++;
}
else
{
result2[k2++] = b[j];
j++;
}
}
}
if(i<n)//因为存在数组长度不等的情况,我们需要再做别的操作。此时已经不需要比较
{
while(i!=n)
{
result2[k2++] = a[i];
i++;
}
}
if(j<m)//同上
{
while(j!=m)
{
result2[k2++] = b[j];
j++;
}
}
}

补集:

 void complement(int a[],int n)//求b相对于a的补集
{
int i = ;
int j = ;
k3 = ;
while(j<k1&&i<n)//二者缺一不可
{
if(a[i]!=result1[j])
{
if(a[i]>result1[j])//自己测试的时候可能一个数组中有相同的元素,所以加了这个判断,不过题目似乎不用
{
j++;
}
else
{
result3[k3] = a[i];
k3++;
i++;
}
}
else
{
i++;
}
}
while(i<n)
{
result3[k3++] = a[i];
i++;
}
}

我在补集的时候,判断条件起初只写了一个j<k1,然后运行结果错误,后来发现问题,加以改正。

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