以下不代表最优解,只是在学习中突然想到要怎么对数组进行交集与并集的运算
所以在自己尝试写了一遍后记录下来。
给定两个数组:
int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 3, 5, 6, 7};
输出:
1,2,3,4,5,6,7
我的思路:
两个数组的交集第一时间想到的肯定是最简单的两两比较,如果相等就加进新数组,但是这样做会造成时间的大量浪费,如果两个长度各1W的数组,比较完的时间….不可想象。
然后马上就想到Java的HashSet,重复不添加,所以把所有的数组遍历进Set,再遍历Set岂不是就完成了。
于是很容易实现了我的代码:
int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 3, 5, 6, 7};
HashSet hashSet = new HashSet<>();
for (int aNum : a) {
hashSet.add(aNum);
}
for (int bNum : b) {
hashSet.add(bNum);
}
Iterator iterator = hashSet.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
给定两个数组:
int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 3, 5, 6, 7};
输出:
3,4,5
我的思路:与之前相同,强行跑遍历的算法肯定是不可取的,又想到了之前在一堆有重复数的数组中找出唯一一个没有重复的算法:
一是看到的最优解对自身进行^运算。
二是自己思考出的通过HashMap对每个数进行个数统计,如果为1则得出。
同理得出此处交集的运算规则,统计每一个数的出现次数,如果为2,则是交集。
以下为代码实现:
int[] a = {1, 2, 3, 4, 5};
int[] b = {2, 3, 5, 6, 7};
HashMap hashMap = new HashMap(16);
for (int i = 0; i < a.length; i++) {
if (hashMap.get(a[i]) != null) {
hashMap.put(a[i], hashMap.get(a[i]) + 1);
} else {
hashMap.put(a[i], 1);
}
}
for (int i = 0; i < b.length; i++) {
if (hashMap.get(b[i]) != null) {
hashMap.put(b[i], hashMap.get(b[i]) + 1);
} else {
hashMap.put(b[i], 1);
}
}
for (int i : hashMap.keySet()) {
if (hashMap.get(i).equals(2)) {
System.out.print(i+" ");
}
}
}
如有更优解或解题思路出错,感谢指出!