蓝桥杯_算法训练_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++;
}
}
}
}

这个是对上面代码的简单解释。可能有点不清楚,如果大家有更好的思路,欢迎评论提出。
其实知道了交集的做法之后,并集和补集也就很清楚了。
并集:
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,然后运行结果错误,后来发现问题,加以改正。
不足之处希望大家提出来,一起学习。个人觉得可能思路或者代码还是冗余比较多,不是那么精炼,求大神教!
蓝桥杯_算法训练_ALGO10_集合运算的更多相关文章
- ALGO-10_蓝桥杯_算法训练_集合运算(排序)
问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. 第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素. 第三行 ...
- ALGO-115_蓝桥杯_算法训练_和为T(枚举)
问题描述 从一个大小为n的整数集中选取一些元素,使得它们的和等于给定的值T.每个元素限选一次,不能一个都不选. 输入格式 第一行一个正整数n,表示整数集内元素的个数. 第二行n个整数,用空格隔开. 第 ...
- ALGO-143_蓝桥杯_算法训练_字符串变换
问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌握情况.徐老师自己定义了1,,,,5这5个参数分别指代不同的5种字符串操作, ...
- ALGO-27_蓝桥杯_算法训练_FBI树(树,递归)
问题描述 我们可以把由“”和“”组成的字符串分为三类:全“”串称为B串,全“”串称为I串,既含“”又含“”的串则称为F串. FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种.由一个长 ...
- ALGO-6_蓝桥杯_算法训练_安慰奶牛
记: 本题目考的是最小生成数,可使用Kruskal算法 第一次,20分 原因:使用动态数组,有概率报运行错误(大雾= =) 第二次,100分 原因:改用静态数组,一次过 示例代码: #include ...
- ALGO-5_蓝桥杯_算法训练_最短路
记: 一开始没接触过关于最短距离的算法,便开始翻阅关于图的知识, 得知关于最短距离的算法有Dijkstra算法(堆优化暂未看懂),Bellman-Ford算法,Floyd算法,SPFA算法. 由于数据 ...
- 蓝桥杯_算法训练_Torry的困惑(基本型)
这个题目就是求质数的乘积,在加一个模,思路比较简单,直接上代码: #include<iostream> using namespace std; bool isPrime(int a) { ...
- 蓝桥杯_算法训练_区间k大数查询
问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正整数,表示给定的序列. 第三个包含一个正整数m,表示询问个数 ...
- ALGO-43_蓝桥杯_算法训练_A+B Problem
问题描述 输入A,B. 输出A+B. 输入格式 输入包含两个整数A,B,用一个空格分隔. 输出格式 输出一个整数,表示A+B的值. 样例输入 样例输出 数据规模和约定 -,,,<=A,B< ...
随机推荐
- Unity3d项目入门之打Apk包
②结合Android Studio编译器打安卓包 在安卓官网下载AS,按照步骤正常安装编译器完毕,运行AS,点击右下图的图标打开SDK Manager, 选择下载安装相关的“SDK Platform” ...
- docker mysql 主主同步
转发自:https://blog.csdn.net/money9sun/article/details/85099134 第一步:安装docker https://www.cnblogs.com/ ...
- ROS零门槛学渣教程系列(一)——ubuntu安装
本教程使用虚拟机安装ubuntu 实验前准备:下载ubuntu系统镜像 本教程使用的是ubuntu14.04lts版本,有能力的读者可自行下载安装. 推荐使用本人制作的镜像,该镜像已安装好ROS.和配 ...
- Chart Parser 中 Earley's 算法的应用
1. 基本概念 1.1 状态 state 上下文无关文法规则 圆点 · (左边是已分析的,右边是未分析的:点在最右端表示完成状态,否则为未完成状态) 状态的起止位置 1.2 基本操作/算子 opera ...
- Rendering Problems Couldn't resolve resource @dimen/y20
(转)文章转自 songzi1228 的 https://blog.csdn.net/songzi1228/article/details/80255058 本人亲自试用,妥妥的解决了我的问题. R ...
- AD 10使用技巧---新学习
1.修改设计(D)-规则(R) (1)布线线宽(routing)8mil (2)线间距Clearance 8mil (3)过孔大小RoutingVias 2.布局摆放---按主控芯片的管脚要连接的电路 ...
- Ubuntu16.04 静态IP设置
为VMware虚拟机内安装的Ubuntu 16.04设置静态IP地址NAT方式 1.安装环境 VMware 12 Ubuntu 16.04 x86_64 2.在VMware中,配置网络环境 VMwar ...
- Security.ssl-pinning
SSL Pinning 1. What's SSL Pinning? "SSL Pinning is making sure the client checks the server’s c ...
- AST的作用
·代码版本兼容:例如babel ·代码混淆和压缩:将语义变量变无意义 ·开发工具:webpack.vue-cli ·编译:编译器.IDE
- OO第二次作业总结
OO~第二次作业总结 连续三周的电梯作业结束了,总的来说这三次作业做的还算平稳,既没有被刀,也没有刀中别人.那么接下来开始谈谈我对这三次作业的认识. 一.设计策略 我三次作业的设计思路基本上是相同的, ...