所以,我的任务是交叉两个数组,但不允许在最终结果中有2个重复元素。我得到了这个代码,但它不能满足任务,因为如果它在每个数组中有2个相同的数字,在最终结果中它们都会出现。有什么建议吗?
static void printIntersection(int[] arr1, int[] arr2) {
int m = arr1.length;
int n = arr2.length;
int i = 0, j = 0;
while ((i < m) && (j < n)) {
if (arr1[i] == arr2[j]) {
System.out.print(arr1[i] + " ");
i++;
j++;
} else if (arr1[i] < arr2[j])
i++;
else
j++;
}
}
static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
public static void main(String[] args) {
int[] arr1 = {1, 2, 2, 4, 5, 6};
int[] arr2 = {2, 2, 3, 5, 7};
System.out.println("Array1:");
printArray(arr1);
System.out.println("Array2:");
printArray(arr2);
System.out.println("Union:");
System.out.println();
System.out.println("Intersection:");
printIntersection(arr1, arr2);
System.out.println();
}
答案 0 :(得分:0)
您需要维护list/array
以检查是否存在重复元素。
使用ArrayList
是一个选项:
static void printIntersection(int[] arr1, int[] arr2) {
List<Integer> list = new ArrayList<>();
int m = arr1.length;
int n = arr2.length;
int i=0,j=0;
while((i<m) && (j<n)) {
if(arr1[i] == arr2[j]) {
if(!list.contains(arr1[i]))
{
System.out.print(arr1[i] + " ");
list.add(arr1[i]);
}
i++;
j++;
}
else if(arr1[i] < arr2[j])
i++;
else
j++;
}
}
N.B。:我还没有测试过你的算法。
答案 1 :(得分:0)
问题出在这一部分。
如果arr1
中的元素与arr2
中的元素匹配,
它会打印出来并增加两个计数器。
if(arr1[i] == arr2[j]) { System.out.print(arr1[i] + " "); i++; j++; }
上述条件没有说明arr1
本身中的重复元素。
您需要添加更多条件来处理它。
您的输入数组似乎已排序。
在这种情况下,您可以添加条件以仅打印值,并在j
的元素与前一个元素不同时递增arr1
,例如:
if (arr1[i] == arr2[j]) {
if (i == 0 || arr1[i - 1] != arr1[i]) {
System.out.print(arr1[i] + " ");
j++;
}
i++;
}