查找两个数组之间的重复值
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
。因为这听起来像是一项家庭作业或一些练习,所以你应该自己做。
另外,想想你需要什么输出。如果您只需要真/假 a
和 b
是否有一些共同的值,那么您可以在找到第一个匹配项后立即退出循环。相反,如果您需要计算数组之间公共元素的数量,则需要在该组嵌套循环中抛出一个计数器。我会留给你来弄清楚那部分。
【讨论】:
【参考方案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++;
【讨论】:
以上是关于查找两个数组之间的重复值的主要内容,如果未能解决你的问题,请参考以下文章