我想计算两个数组的交集。我的实现导致ArrayIndexOutOfBoundException in the line.. a[index++]=nn.
。请帮助我找到错误:
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int n;
Set<Integer> s1=new HashSet<Integer>();
Set<Integer> s2=new HashSet<Integer>();
int a[]=new int[Math.abs(s1.size()-s2.size())];
int index=0;
if(nums1.length==0|| nums2.length==0){
return a;
}
for(int n1:nums1){
if(!s1.contains(n1))
s1.add(n1);
}
for(int n2:nums2){
if(!s2.contains(n2))
s2.add(n2);
}
for(int nn:s1){
if(s2.contains(nn))
a[index++]=nn;
}
return a;
}
}
最佳答案
您已经很接近解决方案:必须对交叉点使用Set
方法retainAll,如下所示:
public static int[] intersection(int[] nums1, int[] nums2) {
if (nums1.length == 0 || nums2.length == 0) { return null; }
Set<Integer> s1 = new HashSet<Integer>();
Set<Integer> s2 = new HashSet<Integer>();
for (int n1 : nums1) { s1.add(n1); }
for (int n2 : nums2) { s2.add(n2); }
s1.retainAll(s2);
if (s1.isEmpty()) { return null; }
int[] result = new int[s1.size()];
int i = 0;
for (int n : s1) { result[i++] = n; }
return result;
}
使用
Set
add时,无需检查要添加的元素是否已存在于您的集合中。在至少一个数组为空或它们的交集也为空的情况下,我选择返回null
。