这道题目要求俩个数组的交集,且不能重复,我们可以很自然的想到一种办法,就是先遍历第一个数组,将元素存入set,然后再遍历第二个数组,如果元素在set中存在那就说明该元素是肯定存在于第一个数组中的,同时可以把该元素也存入一个set(因为要求输出数组中元素是唯一的),set相对来说数据结构要比数组复杂,所以cpu时间也不会低
还有另外一种方法,这种在数组类算法中一定要考虑到这种方法,就是用数组元素的值作为另外一个数组的下标,这种思路在排序以及这个题目中都是有效的,当然前提一定是下标的范围是有限的,比如这道题目他就限制了数组元素的值不超过1000,我们可以新建一个1001长度的数组,把第一个数组的元素作为新数组的下标,值为1存入,然后遍历第二个数组,值如果是1的可以将值更新为2。然后我们再遍历这个新的数组,值为2的元素对应的下标就是俩个数组的一些交际元素了
import java.util.HashSet;
import java.util.Set;
public class intersectionofTwoArrays {
public static void main(String[] args) {
int[] nums1 = {4,9,5};
int[] nums2 = {9,4,9,8,4};
int[] res = getOnly(nums1,nums2);
for(int i = 0;i<res.length;i++) {
System.out.println(res[i]);
}
System.out.println("================");
int[] arr = getOnly(nums1,nums2);
for(int i = 0;i<arr.length;i++) {
System.out.println(arr[i]);
}
}
public static int[] getOnlyOtherVersion(int[] nums1,int[] nums2) {
int [] arr = new int[1001];
for(int i = 0;i < nums1.length;i++) {
arr[nums1[i]] = 1;
}
for(int i = 0;i<nums2.length;i++) {
if(arr[nums2[i]] == 1) {
arr[nums2[i]] = 2;
}
}
int len = 0;
for(int i = 0;i<arr.length;i++) {
if(arr[i] == 2) {
len++;
}
}
int j = 0;
int[] res = new int[len];
for(int i = 0;i<arr.length;i++) {
if(arr[i] == 2) {
res[j++] = i;
}
}
return res;
}
public static int[] getOnly(int[] nums1,int[] nums2) {
Set set = new HashSet();
for(int i = 0;i<nums1.length;i++) {
set.add(nums1[i]);
}
Set<Integer> setOne = new HashSet();
for(int i = 0;i<nums2.length;i++) {
if(set.contains(nums2[i])) {
setOne.add(nums2[i]);
}
}
int j = 0;
int[] res = new int[setOne.size()];
for(int i : setOne) {
res[j++] = i;
}
return res;
}
}