如何仅用循环与条件语句获取两个不规则数组的唯一公共元素
解决数组公共元素重复打印问题
原代码
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}}; boolean duplicate= false; for(int i=0;i<arr1.length;i++) { for(int j=0;j<arr1[i].length;j++) { int transpose = 0; transpose = arr1[i][j]; for(int k=0;k<arr2.length;k++) { duplicate = false; for(int l=0;l<arr2[k].length;l++) { if(transpose == arr2[k][l]) { System.out.println(transpose); duplicate = true; break; } } if(duplicate) break; } } }
问题描述
我尝试仅通过循环与条件语句而非快捷方式来打印两个数组的公共元素,逻辑为遍历arr1的每个元素,检查是否存在于arr2中,存在则打印。但arr1中的1、2、7会被重复遍历并打印两次。
当前输出:
1 2 1 7 2 7 3 6
期望输出:
1 2 7 3 6
要求:避免重复打印已输出的元素,仅使用循环和条件语句解决,不能使用哈希集合等快捷方式。
解决方案
核心思路是记录已经打印过的元素,每次确认元素存在于arr2后,先检查该元素是否已经被打印过,未打印才输出并记录。
可以用一个临时数组存储已打印的元素,再用一个变量记录临时数组中已存储的元素数量,每次操作前遍历临时数组做重复校验:
修改后的代码
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}}; // 用临时数组存储已打印的元素,长度设为arr1的总元素数足够覆盖所有情况 int[] printedElements = new int[arr1.length * arr1[0].length]; int printCount = 0; // 记录已打印元素的数量 for (int i = 0; i < arr1.length; i++) { for (int j = 0; j < arr1[i].length; j++) { int current = arr1[i][j]; boolean existsInArr2 = false; boolean alreadyPrinted = false; // 先检查当前元素是否在arr2中 for (int k = 0; k < arr2.length; k++) { for (int l = 0; l < arr2[k].length; l++) { if (current == arr2[k][l]) { existsInArr2 = true; break; } } if (existsInArr2) break; } // 如果在arr2中,再检查是否已经打印过 if (existsInArr2) { for (int m = 0; m < printCount; m++) { if (printedElements[m] == current) { alreadyPrinted = true; break; } } // 未打印过则输出并加入临时数组 if (!alreadyPrinted) { System.out.println(current); printedElements[printCount] = current; printCount++; } } } }
代码说明
- 新增
printedElements数组存储已输出的元素,printCount跟踪已存储元素的数量,避免遍历数组的空值部分。 - 拆分逻辑:先判断元素是否存在于arr2,再判断是否已打印,减少无效的重复校验。
- 所有操作仅使用循环和条件语句,完全符合要求。
内容的提问来源于stack exchange,提问作者Akshitha
相关产品推荐
相关产品推荐

