问题
给定两个数组,求两个数组的交集,并以数组形式输出。
思路
1)先排序再比较:先对两个数组进行排序,遍历两个数组中的值并比较,如果相同,则将该值放入集合中。如果不同,则较小值的下标自增并继续比较.
2)通过map进行记录:key为集合中的具体值,value为该值在集合中出现的次数。 先遍历nums1,并将值添加到map中,接着遍历nums2, 判断遍历得到的nums2中的每一个值是否在map中,如果在map中则添加到集合中。
实现
1)先排序再比较
public class InterSect {
public static void main(String[] args) {
int[] nums1 = new int[]{4,9,5};
int[] nums2 = new int[]{9,4,9,8,4};
int[] result = interSect(nums1,nums2);
System.out.println(Arrays.toString(result));
}
private static int[] interSect(int[] nums1, int[] nums2) {
/**
* 对数组排序
* 对两个数组中的值进行逐一比较,相同放入集合,
* 如果nums1[i]<nums2[j] ->i++
* 如果nums1[i]>nums2[j] ->j++
*/
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;
int j = 0;
List<Integer> list = new ArrayList<>();
while (i<nums1.length && j<nums2.length){
if (nums1[i] == nums2[j]){
list.add(nums1[i]);
i++;
j++;
}else if (nums1[i]<nums2[j]){
i++;
}else if (nums2[j]<nums1[i]){
j++;
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}
image.png
2)通过map记录
private static int[] interSect2(int[] nums1, int[] nums2) {
//key 值 value 出现的次数
Map<Integer,Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
//遍历nums1
for (int i=0;i<nums1.length;i++) {
map.put(nums1[i],map.getOrDefault(nums1[i],0)+1);
}
//遍历nums2
for (int i=0;i<nums2.length;i++) {
if (map.getOrDefault(nums2[i],0)>0){
list.add(nums2[i]);
map.put(nums2[i],map.getOrDefault(nums2[i],0)-1);
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
网友评论