算法训练 集合运算

在这里插入图片描述
在这里插入图片描述

import java.util.Arrays;
import java.util.Scanner ;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in) ;
int k = 0, index = 0, flag = 0, index1 = 0 ;
int num1 = input.nextInt() ;
int [] arr1 = new int [num1] ;
for(int i=0; i<num1; i++) {
arr1[i] = input.nextInt();
}
int num2 = input.nextInt();
int [] arr2 = new int [num2] ;
for(int j=0; j<num2; j++) {
arr2[j] = input.nextInt() ;
}
//此循环用于记录重复的元素的个数k
for(int i=0; i<num1; i++) {
for(int j=0; j<num2; j++) {
if(arr1[i] == arr2[j]) {
k ++ ;
continue ;
}
}
}
//此循环用于将交集元素传到数组arr3中
int [] arr3 = new int [k] ;
for(int i=0; i<num1; i++) {
for(int j=0; j<num2; j++) {
if(arr1[i] == arr2[j]) {
arr3[index] =arr1[i] ;
index ++ ;
continue ;
}
}
}
//将交集元素由小到大排序后打印输出
Arrays.sort(arr3) ;
for(int i=0; i<arr3.length; i++) {
System.out.print(arr3[i] + " ");
}
System.out.println();


//将交集元素删去
int [] arr4 = new int [num1 - index ] ;
for(int i=0; i<arr1.length; i++) {
for(int j=0; j<arr3.length; j++) {
if(arr1[i] == arr3[j]) {
j = arr3.length - 1 ;
continue ;
}
if(arr1[i] != arr3[j] && j == arr3.length - 1) {
arr4[flag++] = arr1[i];  
if(flag == num1 - index ) {
flag -- ;
}
}
}
}
//将删去交集后的两个数组拼接到一起组成并集
//要考虑到有交集和没有交集两种情况
int [] newarr = new int [num1 - index + num2 ] ;
for(int i=0; i<arr4.length; i++) {
if(arr4.length != arr1.length)
newarr[i] = arr4[i] ;
if(arr4.length == arr1.length) {
newarr[i] =arr1[i] ;
}
}
if(arr4.length != arr1.length) {
for(int j=arr4.length; j<newarr.length; j++) {
newarr[j] = arr2[index1 ++] ;
}
}
if(arr4.length == arr1.length) {
for(int j=arr1.length; j<newarr.length; j++) {
newarr[j] = arr2[index1 ++] ;
}
}
//对并集数组进行排序后输出
Arrays.sort(newarr);
for(int i=0; i<newarr.length; i++) {
System.out.print(newarr[i] + " ");
}
System.out.println();
//考虑到有无交集两种情况,输出余集
Arrays.sort(arr4);
Arrays.sort(arr1);
if(arr4.length != arr1.length)
for(int i=0; i<arr4.length; i++) {
System.out.print(arr4[i] + " ") ;
}

if(arr4.length == arr1.length) {
for(int j=0; j<arr1.length; j++) {
System.out.print(arr1[j] + " ");
}
}
}
}


在这里插入图片描述
在这里插入图片描述
思路:用Java的集合去写可能简单一点,我就用数组和循环写的,思路如下:(1)求交集:剔除两个数组中重复的元素,即将第一个数组arr1与第二个数组arr2重复的元素选出来,存放在一个新的数组arr3中,则arr3中的元素就是交集,然后用Arrays.sort()由小到大排序打印出来即可。注意:因为事先并不知道数组arr3应该分配多大的内存空间,故应我用k去判断交集的个数,以便于分配存储空间给数组arr3。
(2)求并集:将数组arr1中的交集元素删去,然后存放在数组arr4中,然后和arr2拼接到一起就是并集,拼接后存放到数组newarr中,然后排序和打印输出。注意:要考虑到有交集和没有交集两种情况。
(3)求余集:这个比较简单,就是若没有交集,则arr1就是余集;若有交集,则将arr1中的交集元素去掉就是余集,也就是数组arr4。

发布了39 篇原创文章 · 获赞 17 · 访问量 2150

猜你喜欢

转载自blog.csdn.net/nuist_NJUPT/article/details/104797091