求并集(京东2017秋招编程真题)

题目描述:

 
 

给你两个集合,要求 {A} + {B}。

注:同一个集合中不会有两个相同的元素。

输入

多组(不超过 5 组)数据。

每组输入数据分为三行,第一行有两个数字 n,m($0<n,m\leq10000$),分别表示集合 A 和集合 B 的元素个数。后两行分别表示集合 A 和集合 B。每个元素为不超出 int 范围的整数,每个元素之间有一个空格隔开。

输出

针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开。

样例输入

1 2
1
2 3
1 2
1
1 2

样例输出

1 2 3
1 2

这道题求的是两个集合的并集,其实我一开始是打算见两个数组,分别储存两个数组,然后将两个数组合并到一个新的数组中。但这样做显然会增加编程困难:因为在合并过程中,你要不断比较A和B两个集合中有没有相同的元素,复杂度能达到n的平方。虽然程序好写,但在空间上实在是很大的浪费!

所以我转头一想,看了看题目,灵光一闪:这道题不用建立两个数组,实际上只要建立一个数组就可以了!因为它的题目只是要求我要输出集合中的元素,所以我们没必要太耿直地将合并后的数组求出在输出结果。我们只需要将两个集合中的元素放入一个数组中,然后将这个数组进行升序排序,然后,(这一步是重点),遍历整个数组,输出该排好序的数组中的元素,在遍历到相同元素的时候,跳过(continue本次循环即可。

好了,废话不说,先献上代码!

代码如下:

import java.util.Scanner;

public class UnionSetJD {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int a = scanner.nextInt();
			int b = scanner.nextInt();
			int arrays[] = new int[a + b];
			for (int i = 0; i < a + b; i++)
				arrays[i] = scanner.nextInt();
			for (int i = 0; i < a + b; i++) {
				for (int k = i + 1; k < a + b; k++) {
					if (arrays[i] > arrays[k]) {
						int temp = arrays[i];
						arrays[i] = arrays[k];
						arrays[k] = temp;
					}
				}
			}
			for (int i = 0; i < a + b; i++) {
				if(i==a+b-1){
					System.out.println(arrays[i]);
					break;
				}
				if (arrays[i] == arrays[i + 1])   //遇到相同元素的时候,选择不输出,跳过!
					continue;
				System.out.print(arrays[i]+" ");
			}
		}
	}
}

后来我在测评网站上看见一个哥们写的代码很简短,有值得我学习的地方,特此献上供诸位参考!

代码如下:

import java.util.Arrays;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class UnionSetJD {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			Set<Integer> setA = new TreeSet<Integer>();
			for (int i = 0; i < a + b; i++)
				setA.add(sc.nextInt());
			for (Integer i : setA)
				System.out.print(i + " ");
		}
	}
}

哎!看看人家写的程序,我写的程序。没有对比就没有伤害啊!

这哥们的程序中用了Set集合下面的一个类TreeSet,我们来回顾 一下Set集合这个知识点吧!

Set集合下面有两个常用的类HashSet和TreeSet。

HashSet:

HashSet中存放的元素是无序不重复的。

哈希表里面存放的是哈希值hashcode。HashSet存储元素的顺序并不是按照存入时的顺序(和List显然不同) 是按照哈希值来存的,所以取数据也是按照哈希值取得。

HashSet使用hashcode和equals来判断集合中的元素是否重复。

HashSet首先判断两个元素的哈希值hashcode,如果哈希值一样,接着会比较equals方法 如果 equls结果为true ,HashSet就视为同一个元素。如果equals 为false就不是同一个元素。
哈希值相同equals为false的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。也就是哈希一样的存一列。


TreeSet:

存入TreeSet的元素具备比较性的。因为存入这个集合的类实现了Comparable 接口的compareTo 方法,所以我们若想要将一些类(例如自定义的Person类,Book类)存入TreeSet集合,就需要实现该接口,并重写该接口的compareTo方法,也就是要让自定义对象具备比较性.

当compareTo()函数返回值为0时,说明两个对象相等,此时该对象不会添加进来。

对了,题外话一句,Set集合一般使用迭代器迭代元素:

Set s = new HashSet();  
hs.add("a");  
hs.add("b");  
hs.add("c");  
hs.add("d");   
Iterator it = s.iterator();  
while (it.hasNext()) {  
    System.out.println(it.next());  
}  

猜你喜欢

转载自blog.csdn.net/qiuguojing/article/details/79630251
今日推荐