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

Posted

技术标签:

【中文标题】查找两个数组之间的重复值【英文标题】:Finding duplicate values between two arrays 【发布时间】:2012-01-12 20:25:09 【问题描述】:

假设我有以下两个数组:

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

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

我知道我需要做一些循环(可能是嵌套的?),但我不知道如何在循环遍历数组 b 中的所有数字时只使用数组 a 中的第一个数字。

这似乎很简单,我只是无法理解它......

【问题讨论】:

对我来说就像家庭作业。到目前为止你有什么? 你想产生什么输出? 【参考方案1】:

这些解决方案都需要 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!   
    

【讨论】:

他们需要固定的时间。对于较大的 n 值,查找成本可以忽略不计。你建议它是 O(n+nk),其中 k 是一些小的成本?无论哪种方式,这个解决方案都将摊销到 O(n)。【参考方案2】:

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

伪代码看起来像:

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 是否有一些共同的值,那么您可以在找到第一个匹配项后立即退出循环。相反,如果您需要计算数组之间公共元素的数量,则需要在该组嵌套循环中抛出一个计数器。我会留给你来弄清楚那部分。

【讨论】:

【参考方案3】:

你只需要两个嵌套的 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的下一个值并重复。

【讨论】:

每个人从 *** 中得到什么,以及他们选择回答哪些问题,都取决于他们自己。您当然可以随意使用您的选票(这就是选票的用途),但从技术上讲,答案并没有错。 谢谢!这正是我所拥有的,除了当我比较 if() 语句中的值时,我对两个数字都做 [i] 而不是 [i] 为一个,另一个计数器为另一个。 初学者:如果有人寻求帮助,我很乐意提供。除非有人说“这是为了家庭作业”,否则坦率地说,我不是任何教育委员会的成员,我不知道也不关心他们为什么想知道,这不是我要问的地方。当然,最重要的一点是提问者现在知道如何执行任务 - 完成教育,并且对教育系统没有任何成本。【参考方案4】:

由于您没有将此标记为作业,因此我将为您提供怀疑的好处。正如你所说,你需要两个循环;在a[]foreach int 中循环foreach int b[]。然后只需在每次迭代时比较这两个值,即可得到以下简单代码:

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

【讨论】:

很可能 OP 还没有添加此标签的可能性。 @Beginner:看看你的代码,不管是不是伪代码,它和我的几乎没有什么不同。并非所有事情都是功课。 重复的答案本身并不是错误的答案,只要它们的技术内容是正确的。我的观点是,如果您认为某个问题不值得回答,那么您不应该回答这个问题并继续前进,而不是对提供正确信息的答案投反对票。 @Beginner 你有没有使用互联网上的实际代码作为学习工具?我有。你是在毫无必要地假设恶意。 @Beginner 我理解您的担忧。但是,让我们试着假设每个人都是善意的。【参考方案5】:

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

【讨论】:

【参考方案6】:
//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++;
    

【讨论】:

以上是关于查找两个数组之间的重复值的主要内容,如果未能解决你的问题,请参考以下文章

在两个字典数组中查找重复键以使用新数组字典更新旧数组字典

PHP:查找值的数组差异[重复]

PHP:查找值的数组差异[重复]

查找两个数组是不是在数组中重复,然后选择它们

查找两个文本文件之间的差异,每行一项[重复]

在两个数组中为javascript查找缺少的元素[重复]