【问题标题】: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 中的第一个数字。

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

【问题讨论】:

  • 对我来说就像家庭作业。到目前为止你有什么?
  • 你想产生什么输出?

标签: java arrays loops compare


【解决方案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的下一个值并重复。

    【讨论】:

    • 每个人从 StackOverflow 中得到什么,以及他们选择回答哪些问题,都取决于他们自己。您当然可以随意使用您的选票(这就是选票的用途),但从技术上讲,答案并没有错。
    • 谢谢!这正是我所拥有的,除了当我比较 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++;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 2015-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多