我已经阅读过现有的解决方案,但没有一个能解决我的问题。
问题:给定两个已知等于大小n
的数组,创建具有两个数组的公共元素的第三个数组。 (假设每个数组中没有重复项)
示例:
A[] = {5, 4, 12, 15, 9}
B[] = {4, 9, 7, 6, 12}
我的解决方案:
我想首先将数组排序为:
A[] = {4, 5, 9, 12, 15}
B[] = {4, 6, 7, 9, 12}
然而,我无法找到如何在不避免嵌套循环的情况下找到共同元素。我使用过这样的嵌套循环:
int A[] = {5, 4, 12, 15, 9};
int B[] = {4, 9, 7, 6, 12};
// maximum common elements can be size of one array
int[] C = new int[A.length];
int idx = 0; // of C
// output check: all zero
for(int i = 0; i < C.length; i++)
System.out.println(C[i]);
// find and transfer common elements
for(int i = 0; i < A.length; i++){
for(int j = 0; j < B.length; j++){
if(A[i] == B[j])
C[idx++] = A[i];
}
}
// output check
for(int i = 0; i < C.length; i++)
System.out.println(C[i]);
但是这种方法的问题在于,正如预期的那样,C[] = {4, 9, 12, 0, 0}
即最后两个元素保留为零,因为只有三个共同元素。但是,如果输入数组本身有0
s,则很难说C
中是否存在这些零,因为它们对A
和B
都是通用的或者仅仅是因为没有更多的常用元素可以填写(如上所述)。
我当然可以首先使用嵌套循环来计算公共元素的数量m
,然后创建一个大小为C
的数组m
,然后用公共元素填充它<{1}}和A
使用另一个嵌套循环,但这将非常耗时。
限制:除了简单的排序/搜索算法之外,我不能使用HashSet,HashTable或任何其他JavaUtils或Java所提供的任何东西(因此前者还没有教过我)
问题:上述查询的最快方法是什么? (考虑到我发布的限制)
答案 0 :(得分:3)
您可以为每个阵列保留单独的计数器,并根据您知道的信息递增。 (数组已排序)。
public class SortedArray {
public static void main(String[] args) {
int a[] = {4, 5, 9, 12, 15};
int b[] = {4, 6, 7, 9, 12};
int c[] = new int[5];
int count = 0;
int i = 0; int j = 0;
while (i<a.length && j<b.length) {
if (a[i]==b[j]) {
c[count] = a[i];
count++;
i++;
j++;
}
else if (a[i] < b[j]) {
i++;
} else {
j++;
}
}
for (int k=0; k<count; k++) {
System.out.print(c[k] + "\t");
}
}
}
输出:
4 9 12