• 蓝桥杯_算法训练_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,然后运行结果错误,后来发现问题,加以改正。

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

  • 相关阅读:
    vue组件详解(四)——使用slot分发内容
    vue组件详解(三)——组件通信
    vue组件详解(二)——使用props传递数据
    vue组件详解(一)——组件与复用
    vue表单详解——小白速会
    vue class与style 绑定详解——小白速会
    vue内置指令详解——小白速会
    vue计算属性详解——小白速会
    SQL查询当天、本周、本月记录详解
    SQL Server中使用convert进行日期转换
  • 原文地址:https://www.cnblogs.com/allein-STR/p/7381172.html
Copyright © 2020-2023  润新知