JAVA-蓝桥杯-算法训练 集合运算

问题描述
  给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
  第一行为一个整数n,表示集合A中的元素个数。
  第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
  第三行为一个整数m,表示集合B中的元素个数。
  第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
  集合中的所有元素均为int范围内的整数,n、m<=1000。
输出格式
  第一行按从小到大的顺序输出A、B交集中的所有元素。
  第二行按从小到大的顺序输出A、B并集中的所有元素。
  第三行按从小到大的顺序输出B在A中的余集中的所有元素。
样例输入
5
1 2 3 4 5
5
2 4 6 8 10
样例输出
2 4
1 2 3 4 5 6 8 10
1 3 5

具体思路:首先定义两个数组,然后先求交集,交集采用双重循环来判断,如果两个
数组中的数字有相同的就把他放到重新定义的一个数组中然后输出,并集:并集的话
先把两个数组的元素值去全部放到一个数组中,因为这两个数组中可能存在相同的值
所以我们还要去重,去重的话就是采用n1和n2的交集和并集去比较,去掉重复的,然
后补集就是用n2去跟n1比较,如果n2中有元素跟n1中的元素相同,那么就去除n1中的
相同元素,然后输出。

具体代码如下:

import java.util.Arrays;
import java.util.Scanner;
public class 交集并集 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc= new Scanner(System.in);
		int n = sc.nextInt(); //定义第一个数组的长度
		long n1 []=new long[n];
		for(int j=0;j<n;j++){
			n1[j]=sc.nextInt();
		}
		int m = sc.nextInt();//定义第二个数组的长度
		long n2 []=new long[m];
		for(int i = 0;i<m;i++){
			n2[i]=sc.nextInt();
		}
		//循环遍历,求交集
		Arrays.sort(n1);//数组1排序
		Arrays.sort(n2);//数组2排序
		int c = 0;  //统计交集数字的个数
		long n3[]=new long[2000];//定义一个数组来储存交集的数字
		for(int x = 0,i=0;x<n;x++){
			for(int y = 0;y<m;y++){
				if(n1[x]==n2[y]){  //双重循环,如果数组1中的数字等于数组2中的数字,则存入n3数组中
					n3[i]=n1[x];
				    c++;i++;
				}
			}
		}
		//输出交集数组
		for(int d=0;d<c;d++){
			System.out.print(n3[d]+" ");
		}
		//输出并集数组
		System.out.println();
		f(n1,n2);  //调用函数f
		//输出补集数组
		System.out.println();
		h(n1,n2);  //调用函数h
	}
	public static void f(long n1[],long n2[]){
		long n4[]=new long[n1.length+n2.length]; //定义一个数组n4用来储存并集后的数字
		for(int a = 0;a<n1.length;a++){ 
			n4[a]=n1[a]; //把数组n1中的数字放到n4中,然后进行编号
		}
		for(int b = n1.length,i=0;b<n1.length+n2.length;b++){
			n4[b]=n2[i];   //把数组n2中的数字放到n4中,编号从n1的长度开始
			i++;
		}
		Arrays.sort(n4); //从小到大排序
		//定义数组n5用来储存n1和n2数组中相同的数字
		long n5[]=new long[2000];
		int c = 0;
		for(int x = 0,i=0;x<n1.length;x++){
			for(int y = 0;y<n2.length;y++){
				if(n1[x]==n2[y]){
					n5[i]=n1[x]; 
					c++;i++;
				}	
			}
		}
		//把n4中重复的数字变为0
		for(int x = 0;x<n4.length;x++){
			for(int y = 0;y<c;y++){
				if(n4[x]==n5[y]){  //n4数组中有些数字是重复的,所以重复的数字变为0
					n4[x]=0;
				}
			}
		}
		int t = 0;
		//把n4中不等于0的数字存入n7中
		long n7[]=new long[n4.length-c];
		for(int j = 0,i = 0;j<n4.length;j++){
			if(n4[j]!=0){
				n7[i]=n4[j];
				t++;
				i++;
			}
		}
		//最后定义一个数组,存入n5和n7的所有数字,就是最后的并集
		long n10[]=new long[c+t];
		for(int a = 0;a<c;a++){
			n10[a]=n5[a];
		}
		for(int b = c,i=0;b<c+t;b++){
			n10[b]=n7[i];
			i++;
		}
		//自动排序n10
		Arrays.sort(n10);
		for(int f=0;f<c+t;f++){
			System.out.print(n10[f]+" ");
		}
	}
	public static void h(long n1[],long n2[]){
		long n5[]=new long[2000];
		int c = 0;
		//获取n1和n2中相同的数字
		for(int x = 0,i=0;x<n1.length;x++){
			for(int y = 0;y<n2.length;y++){
				if(n1[x]==n2[y]){
					n5[i]=n1[x]; 
					c++;i++;
				}	
			}
		}
		int j = 0;//这里是统计不同数字的次数用于下面的输出
		long n6[]=new long[n1.length];
		for(int g = 0,i=0;g<n1.length;g++){  //把n5中的数字跟n1中的数字作比较,如果不同则存入n6数组中
			int t = 0;
		   for(int d=0;d<c;d++){
			   if(n1[g]==n5[d]){
				   t++; //如果有相同的,则t会自加用于后面的判断
			   } 	   
		   }
		   if(t==0){ //如果t等于0则说明没有相同的数字,则存入n6数组中
			   n6[i]=n1[g];
			   i++; //n6中数组下标自加
			   j++; //这里是统计不同数字的次数用于下面的输出
			}
	    }
		for(int f=0;f<j ;f++){
			System.out.print(n6[f]+" ");
		}
	}
}

结果

6
4 9 5 1 6 3
5
4 2 1 3 6

交集:1 3 4 6 
并集:1 2 3 4 5 6 9 
补集:5 9
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值