原题:
题意:
计算两个整形数组的交集。
解题思路:
这个题是在计算两个数组的交集,如果数组中的每个元素都不重复,这道题还是很好解的,这个题的难点在于处理数组中重复的元素。就如题目示例给的那样,两个数组都有重复的元素2,这样就不能用常规的比较的方法去解题。我在网上看到有人用Map,感觉挺好理解,具体的实现步骤是:
1.定义一个Map和ArrayList;
2.用一个for循环遍历第一个数组,把数组的元素作为map的key值,value值设为1,如果有重复的元素则把value值加1;
3.用for循环遍历第二个数组,把数组中的元素作为key值判断map中是否存在,如果存在则说明这个元素在两个数组中都存在,接下来再判断这个key对应的value是否大于0,如果都成立,则把这个元素放入list中,接下来把这个key对应的value值减去1,这样做的目的是为了保证两个数组的重复元素一致,比如第一个数组中的某个元素重复出现了2次,而第二个数组中的元素重复出现了三次,那么最后取交集只会取两个,第三次因为对应的value值为0了,所以不存进list中了。
4.定义一个整形数组,遍历list,把list中的值赋给数组,然后return。
实现代码:
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0 ; i<nums1.length ; i++){
if(map.containsKey(nums1[i])){
map.put(nums1[i], map.get(nums1[i]) + 1);
}else{
map.put(nums1[i], 1);
}
}
for(int j = 0 ; j<nums2.length ; j++){
if(map.containsKey(nums2[j]) && map.get(nums2[j])>0){
list.add(nums2[j]);
map.put(nums2[j], map.get(nums2[j])-1);
}
}
int[] result = new int[list.size()];
for (int i = 0; i < result.length; i++) {
result[i] = list.get(i);
}
return result;
}