在两个数组之间查找重复值

时间:2011-12-04 23:38:34

标签: java arrays loops compare

假设我有以下两个数组:

int[] a = [1,2,3,4,5];
int[] b = [8,1,3,9,4];

我想取数组a的第一个值 - 1 - 并查看它是否包含在数组b中。所以,我会得到a中的'1'在b中,即使它不在同一位置。一旦我完成了a中第一个元素的比较,我就转到数组a中的下一个数字并继续该过程,直到我完全通过第一个数组。

我知道我需要做一些循环(可能是嵌套的?)但我不知道如何在循环遍历数组{{1}中的所有数字的情况下如何坚持数组a中的第一个数字}}

这似乎相当简单,我无法理解它......

6 个答案:

答案 0 :(得分:21)

这些解决方案都需要O(n ^ 2)时间。您应该利用hashmap / hashset来实现更快的O(n)解决方案:

void findDupes(int[] a, int[] b) {
    HashSet<Integer> map = new HashSet<Integer>();
    for (int i : a)
        map.add(i);
    for (int i : b) {
        if (map.contains(i))
            // found duplicate!   
    }
}

答案 1 :(得分:7)

是的,你需要两个循环,是的,嵌套。

伪代码它看起来像:

for each in A do
    for each in B do
       if (current item of A equals to current item of B)
           say yes!
    done
done

现在您需要的一切就是将其翻译为Java。因为它听起来像是一个家庭作业或一些运动,你应该自己做。

另外,请考虑您需要的输出。如果您只需要一个真/假,ab是否有一些共同的值,那么您可以在找到第一个匹配后立即退出循环。相反,如果需要计算数组之间的公共元素的数量,则需要将计数器抛入该组嵌套循环中。我会把它留给你来弄清楚那部分。

答案 2 :(得分:6)

你只需要两个嵌套的for循环

for(int i = 0; i < a.length; i++)
{
    for(int j = 0; j < b.length; j++)
    {
        if(a[i] == b[j])
        {
            //value is in both arrays
        }
    }
}

这样做是转到a的第一个值并与b中的每个值进行比较,然后转到a的下一个值并重复。

答案 3 :(得分:1)

由于你没有把这个标记为作业,我会给你怀疑的好处。正如你所说,你需要两个循环; foreach中的int a[]foreach中的int b[]。然后只需比较每次迭代时的两个值,它们为您提供了简单的代码:

for (int x : a) {
   for (int y : b) {
      if (x == y) {
         System.out.println("a[] and b[] both contain " + x);
      }
   }
}

答案 4 :(得分:1)

取决于数据(其大小,每个值是否唯一等)以及您尝试从中获取的内容(即,a的每个元素是否在b中,或者在b中的索引),在你做它之前做一些开销工作​​可能是有益的。例如,如果你对两个数组进行排序(你只需要做一次),你就可以开始最后停止它的内部循环(因为你知道你正在寻找一个数字&gt; =你看过的那个为了最后,所以它必须在这个索引或更高),你也可以更快地停止内循环(因为你知道,如果你正在寻找X,你没有找到它之前看到一个值&gt; X ,然后X不存在)。另一种方法是将两个值加载到Set中,您现在可以有效地进行探测。

答案 5 :(得分:0)

//O(n log(n)), Linear Space Complexity  

void findDuplicates(int[] x, int[] y){
    Arrays.sort(x);
    Arrays.sort(y);
    int i = 0,j = 0;
    while (i < x.length && j < y.length) {
        if(x[i] == y[j]){
            System.out.println(x[i]);
            i++;
            j++;
        }else if (x[i] < y[j])
            i++;
        else
            j++;
    }
}