我想计算两个数组的交集。我的实现导致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

10-07 23:34