题目:
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
【题目分析】
根据实例得知,这个交集是不用去重的。
与此题类似,关键的不同之处在于如何取到相交重复元素的最小值。
步骤:
【第一步】定义map,将数组1存入map,key为数组的值,value为出现的次数
【第二步】定义List数组作为返回值,由于不知道数组的长度,因此定义可变数组接收结果。
【第三步】遍历数组2,判断是否有交集,如果有交集则,则将value值减一,这样就可以得到,最小的交集次数。
【代码如下】
package hash;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
public class Intersect {
public static void main(String[] args) {
int[] num1 = {1, 2, 2, 1};
int[] num2 = {1, 2, 2, 2};
int[] intersect = intersect(num1, num2);
System.out.println("intersect = " + Arrays.toString(intersect));
}
public static int[] intersect(int[] nums1, int[] nums2) {
// 1 将数组1存入到map中,key 存数组的值, value存出现的次数
HashMap<Integer, Integer> map = new HashMap<>();
for (int i : nums1) {
map.put(i, map.getOrDefault(i, 0) + 1);
}
// 2.定义List 存储相交的结果
List<Integer> res = new ArrayList<>();
for (int i : nums2) {
if (map.getOrDefault(i, 0 ) > 0) {
res.add(i);
map.put(i,map.get(i) - 1);
}
}
// 3.得到输出
int[] result = new int[res.size()];
for (int i = 0; i < result.length; i++) {
result[i] = res.get(i);
}
return result;
}
}