问题描述
给出两个整数集合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