假设我有以下两个数组:
int[] a = [1,2,3,4,5];
int[] b = [8,1,3,9,4];
我想取数组a
的第一个值 - 1 - 并查看它是否包含在数组b
中。所以,我会得到a
中的'1'在b
中,即使它不在同一位置。一旦我完成了a
中第一个元素的比较,我就转到数组a
中的下一个数字并继续该过程,直到我完全通过第一个数组。
我知道我需要做一些循环(可能是嵌套的?)但我不知道如何在循环遍历数组{{1}中的所有数字的情况下如何坚持数组a
中的第一个数字}}
这似乎相当简单,我无法理解它......
答案 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
。因为它听起来像是一个家庭作业或一些运动,你应该自己做。
另外,请考虑您需要的输出。如果您只需要一个真/假,a
和b
是否有一些共同的值,那么您可以在找到第一个匹配后立即退出循环。相反,如果需要计算数组之间的公共元素的数量,则需要将计数器抛入该组嵌套循环中。我会把它留给你来弄清楚那部分。
答案 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++;
}
}