题目
Find common elements of two arrays
output the number of common elements and each common element
TC1:array1 = [1,2,3] array2 =[2,3,4] result: 2,[2,3]
TC2:
array1 = [1,2,3, 3] array2 = [2,3,4] result: 2,[2,3]
TC3:
array1 = [1,2,3] array2 =[2,3,4,3] result: 2,[2,3]
TC4:
array1 = [1,2,3,3]
array2 = [2, 3,4, 3]
result: 3,[2,3,3]
一开始我想的很简单,两个数组遍历,相同的元素添加进list就好了
然而实现了以后就发现单纯了,给的数组是会有重复的,如果我选择去重,那么数组里本该重复的元素就被我去掉了,如果我不去重,又会重复多次统计,导致结果一直都不对,下面的是一开始有问题的写法
static void findCommoElements(int[] arr1, int[] arr2) {
ArrayList<Integer> result = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2.length; j++) {
if (arr1[i] == arr2[j]) {
if (!result.contains(arr1[i])) {
result.add(arr1[i]);
}
}
}
}
System.out.print(result.size() + " {");
for (int i = 0; i < result.size(); i++) {
System.out.print(result.get(i));
if (i == result.size() - 1) {
System.out.print("}");
} else {
System.out.print(",");
}
}
System.out.println();
}
发现问题后请教了很多大牛,发现java可以用双指针的方式实现,但是要先进行排序,下面给出正确的写法
public static void main(String[] args) {
//TC1:
int[] array1 = {1, 2, 3};
int[] array2 = {2, 3, 4};
findElements(array1, array2);
//result: 2,{2,3};
//TC2:
int[] two1 = {1, 2, 3, 3};
int[] two2 = {2, 3, 4};
findElements(two1, two2);
//result:2, {2, 3};
//TC3:
int[] three1 = {1, 2, 3};
int[] three2 = {2, 3, 4, 3};
findElements(three1, three2);
//result:2, {2, 3};
//TC4:
int[] four1 = {1, 2, 3, 3};
int[] four2 = {2, 3, 4, 3};
findElements(four1, four2);
//result:3, {2, 3, 3};
}
static void findElements(int[] arr1, int[] arr2) {
ArrayList<Integer> result = new ArrayList<>();
Arrays.sort(arr1);
Arrays.sort(arr2);
// 查找重复元素
int one = 0;
int two = 0;
while (arr1.length > one) {
// 如果数组1的值大于数组2的值,说明数组2的值滞后了,需要给数组2的索引加1
while (arr2.length > two && arr1[one] > arr2[two]) {
two++;
}
// 如果数组1的值等于于数组2的值,这个元素需要添加
if (arr2.length > two && arr1[one] == arr2[two]) {
result.add(arr1[one]);
one++;
two++;
}
// 如果数组1的值小于数组2的值,说明数组1的值滞后了,需要给数组1的索引加1
if (arr2.length > two && arr1.length > one && arr1[one] < arr2[two]) {
one++;
}
}
printList(result);
}
// 输出结果的list
static void printList(ArrayList<Integer> list) {
System.out.print(list.size() + ", {");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
if (i == list.size() - 1) {
System.out.print("}");
} else {
System.out.print(",");
}
}
System.out.println();
}
以上就是自己做的总结和记录