我做了这个方法,比较两个数组的数字,然后返回多少个数字彼此相等,但无论有多少数字相等,该方法每次都返回值 1。(两个数组的长度相同)。
public static void main(String[] args) {
int a [] = {1, 4, 6, 7, 8, 10, 13};
int b [] = {1, 2, 3, 4, 5, 6, 7};
equal(a,b);
}
public static int equal(int[] a, int[] b){
int j = 0;
for(int i = 0; i< a.length-1;i++){
if(a[i] == b[i]){
j++;
}
}
System.out.println(j);
return j;
}
您的代码正在查找在同一索引处相等的数字。
有几种方法可以找到交叉点的大小。
一个简单但 O(m*n) 的实现是针对 a 的每个元素迭代 b 的所有元素。
如果对数组进行排序,则可以对两个数组使用单独的索引,在无法再匹配时前进每个数组。这将是 O(m+n)。(如果它们没有排序,你可以先对它们进行排序,成本为 O(m log m + n log n)。
如果每个数组没有重复的成员,另一种方法是根据集合差的大小计算交集的大小。这方面的一个例子是 http://ideone.com/6vLAfn。关键部分是将每个数组转换为一个集合,并通过从一个集合中删除另一个集合来确定有多少个成员是共同的。
int aSizeBefore = setA.size();
setA.removeAll( setB );
int aSizeAfter = setA.size();
return aSizeBefore - aSizeAfter;
检查数组a
中的任何单个数字是否也在数组b
中,则应使用嵌套的for循环。
例如
int numMatches = 0;
for (int i = 0; i < a.length; ++i)
{
for (int j = 0; j < b.length; ++j)
{
if (a[i] == b[j])
++numMatches; //Naive, as obviously if the same number appears twice in a it'll get counted twice each time it appears in b.
}
}
当前代码只是检查同一索引匹配的元素,即
1 == 1 // Yes, increment j
4 == 2 // Nope
6 == 3 // Nope
7 == 4 // Nope
8 == 5 // Nope
10 == 6 // Nope
13 == 7 // Nope
具有相同值的元素可能位于不同的索引中。假设数组已排序,您可以编写如下:
public static int equal(int[] a, int[] b) {
int count = 0;
for(int i = 0; i < a.length - 1; i++) {
for(int j = 0; i < b.length - 1; j++) {
if (a[j] < b[j]) {
// we came to the part where all elements in b are bigger
// than our selected element in a
break;
}
else if (a[j] == b[j]) {
count++;
}
}
}
System.out.println(count);
return count;
}
如果不能保证数组已排序,则可以删除 if 块并从循环中删除 else-if 的 else。
如果您想知道两个数组中都存在多少个数字,并且保证它们是有序的,则应尝试以下操作:
public static int equal(int[] a, int[] b) {
int j, result = 0;
int lastFound = 0;
for (int i = 0; i < a.length - 1; i++) {
for (j = lastFound; j < b.length; j++) {
if (a[i] == b[j]) {
result++;
lastFound = j;
break;
} else {
if (a[i] < b[j]) break;
}
}
}
return result;
}
使用变量 lastFound
将加快循环速度,但仅当数组按顺序排序时才有用,如示例所示。