多维交错数组唯一公共元素提取问题及Java代码优化求助
解决多维交错数组公共元素去重打印问题
你当前的代码会重复打印公共元素,核心问题是没对数组1中的重复元素做去重处理——数组1里同一个元素出现几次,就会触发几次检查和打印逻辑,导致重复输出。
用Java的Set集合可以轻松解决这个问题,因为Set天然不允许重复元素,刚好适配“每个公共元素仅打印一次”的需求,下面提供两种可行方案:
方案一:双Set高效处理(推荐)
先把数组2的所有元素存入Set用于快速查找,再把数组1的元素去重后,逐一检查是否存在于数组2的Set中,存在则打印。这种方法时间效率更高,适合元素较多的场景。
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class CommonElements { public static void main(String[] args) { int[][] arr1 = new int[][]{{1, 2, 1}, {9, 7, 2}, {7, 3, 6}}; int[][] arr2 = new int[][]{{2, 6, 8}, {0, 1, 7}, {7, 2, 0}, {8, 3}}; System.out.println("Input 1:"); for (int[] subArr : arr1) { System.out.println(Arrays.toString(subArr)); } System.out.println("Input 2:"); for (int[] subArr : arr2) { System.out.println(Arrays.toString(subArr)); } // 把数组2的所有元素存入Set,实现O(1)快速查找 Set<Integer> arr2Elements = new HashSet<>(); for (int[] subArr : arr2) { for (int num : subArr) { arr2Elements.add(num); } } // 把数组1的元素去重,存入另一个Set Set<Integer> uniqueArr1Elements = new HashSet<>(); for (int[] subArr : arr1) { for (int num : subArr) { uniqueArr1Elements.add(num); } } // 遍历去重后的数组1元素,检查是否在数组2中,存在则打印 System.out.println("\n公共元素(去重后):"); for (int num : uniqueArr1Elements) { if (arr2Elements.contains(num)) { System.out.println(num); } } } }
方案二:在原代码基础上修改
新增一个Set记录已经打印过的元素,每次准备打印前先检查该元素是否已输出,未输出才打印并标记,避免重复。
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class CommonElements { public static void main(String[] args) { int[][] arr1 = new int[][]{{1, 2, 1}, {9, 7, 2}, {7, 3, 6}}; int[][] arr2 = new int[][]{{2, 6, 8}, {0, 1, 7}, {7, 2, 0}, {8, 3}}; System.out.println("Input 1:"); for (int i = 0; i < arr1.length; i++) { System.out.println(Arrays.toString(arr1[i])); } System.out.println("Input 2:"); for (int j = 0; j < arr2.length; j++) { System.out.println(Arrays.toString(arr2[j])); } boolean duplicate = false; // 新增Set记录已打印的元素,避免重复输出 Set<Integer> printedElements = new HashSet<>(); for (int i = 0; i < arr1.length; i++) { for (int j = 0; j < arr1[i].length; j++) { int transpose = arr1[i][j]; // 若元素已打印过,直接跳过后续逻辑 if (printedElements.contains(transpose)) { continue; } duplicate = false; for (int k = 0; k < arr2.length; k++) { for (int l = 0; l < arr2[k].length; l++) { if (transpose == arr2[k][l]) { System.out.println(transpose); printedElements.add(transpose); // 标记为已打印 duplicate = true; break; } } if (duplicate) break; } } } } }
内容的提问来源于stack exchange,提问作者Akshitha
相关产品推荐
相关产品推荐

