Java求数组的交集(双指针实现)

题目

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();
  }

以上就是自己做的总结和记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java 中,可以使用集合来两个数组交集。 首先,将两个数组转换为集合,可以使用 Arrays.asList() 方法。然后,可以使用 Collection 类的 retainAll() 方法来计算两个集合的交集。 retainAll() 方法会修改调用它的集合,使其只包含与传递给它的集合中都存在的元素。 例如,假设你有两个数组,分别为 int[] arr1 和 int[] arr2,你可以这样计算它们的交集: ``` List<Integer> list1 = Arrays.asList(ArrayUtils.toObject(arr1)); List<Integer> list2 = Arrays.asList(ArrayUtils.toObject(arr2)); list1.retainAll(list2); int[] intersection = ArrayUtils.toPrimitive(list1.toArray(new Integer[0])); ``` 注意,上面的代码使用了 Apache Commons Lang 库中的 ArrayUtils 工具类来将数组转换为集合,并将集合转换回数组。如果你不想使用这个库,也可以手动实现这个转换。 最后,交集的结果存储在 int[] intersection 中。 ### 回答2: 可以使用HashSet来数组中的交集。 首先,我们可以创建一个HashSet去存储第一个数组中的元素。接着,我们遍历第二个数组,判断每个元素是否在HashSet中存在。如果存在,我们将该元素存储到另一个HashSet中,这个HashSet就是我们想要的交集。 以下是一个示例代码: ``` import java.util.Arrays; import java.util.HashSet; public class Main { public static void main(String[] args) { int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = {4, 5, 6, 7, 8}; HashSet<Integer> set1 = new HashSet<>(); HashSet<Integer> intersect = new HashSet<>(); for (int num : arr1) { set1.add(num); } for (int num : arr2) { if (set1.contains(num)) { intersect.add(num); } } System.out.println("数组交集:" + intersect.toString()); } } ``` 运行以上代码,输出结果为: ``` 数组交集:[4, 5] ``` 通过这种方法,我们可以轻松地找到两个数组交集。 ### 回答3: 要实现一个Java函数,该函数可以找到两个给定数组交集元素。 可以使用HashSet来解决这个问题。首先,创建一个HashSet来存储第一个数组中的所有元素。然后,遍历第二个数组,对于每个元素,检查它是否在HashSet中出现过。 如果一个元素在HashSet中出现过,那么它是两个数组交集元素之一。因此,将该元素添加到一个结果集合中,以便最后返回。 以下是一个示例实现: ```java import java.util.HashSet; import java.util.Set; public class ArrayIntersection { public static int[] findIntersection(int[] nums1, int[] nums2) { Set<Integer> set = new HashSet<>(); Set<Integer> intersection = new HashSet<>(); for (int num : nums1) { set.add(num); } for (int num : nums2) { if (set.contains(num)) { intersection.add(num); } } int[] result = new int[intersection.size()]; int index = 0; for (int num : intersection) { result[index++] = num; } return result; } public static void main(String[] args) { int[] nums1 = {1, 2, 2, 1}; int[] nums2 = {2, 2}; int[] intersection = findIntersection(nums1, nums2); // 输出交集元素 for (int num : intersection) { System.out.print(num + " "); } } } ``` 在上面的示例中,我们使用HashSet将数组`nums1`中的元素存储在集合中。然后,遍历数组`nums2`,并检查每个元素在HashSet中是否存在。如果存在,将其添加到结果集合`intersection`中。 最后,我们将结果集合转换为一个整型数组,并将其返回。在main函数中,我们使用示例数组调用`findIntersection`函数,并输出结果。 以上代码输出为:`2`,表示两个数组交集元素为`2`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值