给定两个数组,编写一个函数来计算它们的交集。
实施例: 给定nums1 = [1,2,2,1],nums2 = [2,2],返回[2]。
注意:
我通过以下代码解决它:
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1.length==0 || nums2.length==0){
return new int[0];
}
Arrays.sort(nums1);
Arrays.sort(nums2);
ArrayList<Integer> list = new ArrayList();
int len1 = nums1.length;
int len2 = nums2.length;
int i1 = 0;
int i2 = 0;
while(i1<len1 && i2<len2){
if(nums1[i1]==nums2[i2]){
if(!list.contains(nums1[i1]))
list.add(nums1[i1]);
i1 ++ ;
i2 ++;
}else if(nums1[i1]>nums2[i2]){
i2 ++;
}else {
i1 ++;
}
}
int result[] = toIntArray(list);
return result;
}
int[] toIntArray(List<Integer> list) {
int[] ret = new int[list.size()];
int i = 0;
for (Integer e : list)
ret[i++] = e.intValue();
return ret;
}
首先我对两个数组进行排序。然后我查看了数组。我认为有一个更好的解决方案
答案 0 :(得分:4)
如果您被允许使用哈希集,那么非常简单,因为a.retainAll(b)
会导致a intersect b
:
public Integer[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set1 = new HashSet<>();
for(int i : nums1) {
set1.add(i);
}
HashSet<Integer> set2 = new HashSet<>();
for(int i : nums2) {
set2.add(i);
}
set1.retainAll(set2);
return set1.toArray(new Integer[set1.size()]);
}
答案 1 :(得分:2)
如果您使用java-8:
,这是一个解决方案Arrays.stream(arr1)
.filter(x -> Arrays.stream(arr2)
.anyMatch(y -> y == x)
)
.distinct()
.forEach(System.out::println);
以下是实现相同的方法:
public static int[] intersection(int[] a, int[] b) {
return Arrays.stream(a)
.filter(x -> Arrays.stream(b)
.anyMatch(y -> y == x)
)
.distinct()
.toArray();
}
答案 2 :(得分:0)
是的,有:
public Integer[] intersection(int[] nums1, int[] nums2)
{
ArrayList<Integer> list = new ArrayList();
int len1 = nums1.length;
int len2 = nums2.length;
int k = 0;
for(int i = 0;i<Java.lang.Math.min(len1,len2);i++)
for(int j = 0;j<Java.lang.Math.min(len1,len2);j++)
if(nums1[i] == nums2[j] && !list.contains(new Integer(nums1[i])))
list.add(k++,nums1[i]);
return list.toArray(new Integer[foo.size()]);
}