实现int数组union方法:检测交集并构建无重复合并数组
问题分析与修正方案
我来帮你梳理当前代码里的问题,然后给出贴合你设计思路的修正实现:
一、当前代码存在的核心问题
isSet方法效率低下:
原方法中即使找到重复元素,仍会继续循环遍历,没有提前终止判断。虽然逻辑结果是对的,但可以优化得更高效。union方法中array3未填充有效元素:
你只初始化了array3的长度,但完全没有把array2中与array1不重复的元素存入其中,直接拼接后这部分元素都是默认的0,完全不符合预期。未处理非集合的边界情况:
当任意一个输入数组不是集合时,当前代码会返回一个长度错误且元素未正确初始化的数组,没有做合理的异常处理。重复元素计数逻辑冗余:
原代码通过双层循环统计重复次数count,但因为已经验证过两个数组都是集合,每个重复元素只会出现一次,这个计数可以简化为直接筛选不重复元素。
二、修正后的代码实现
1. 优化后的isSet方法
public boolean isSet(int[] array) { // 空数组或单元素数组本身就是集合 if (array == null || array.length <= 1) { return true; } for (int i = 0; i < array.length; i++) { for (int n = i + 1; n < array.length; n++) { if (array[i] == array[n]) { // 找到重复元素立即返回,无需继续遍历 return false; } } } return true; }
2. 修正后的union方法(使用List简化逻辑)
这个版本用ArrayList动态收集不重复元素,代码更简洁易读:
public int[] union(int[] array1, int[] array2) { // 先验证两个数组是否都符合集合要求 if (!isSet(array1) || !isSet(array2)) { // 不符合要求时返回null,也可以根据需求抛出IllegalArgumentException return null; } // 收集array2中与array1无重复的元素 List<Integer> uniqueFromArray2 = new ArrayList<>(); for (int num : array2) { boolean isDuplicate = false; for (int num1 : array1) { if (num == num1) { isDuplicate = true; break; } } if (!isDuplicate) { uniqueFromArray2.add(num); } } // 拼接结果数组 int[] unionArray = new int[array1.length + uniqueFromArray2.size()]; // 复制array1的所有元素 System.arraycopy(array1, 0, unionArray, 0, array1.length); // 复制array2中筛选出的不重复元素 for (int i = 0; i < uniqueFromArray2.size(); i++) { unionArray[array1.length + i] = uniqueFromArray2.get(i); } return unionArray; }
3. 纯数组实现的union方法(不使用集合类)
如果要求完全用数组操作,也可以这样写:
public int[] union(int[] array1, int[] array2) { if (!isSet(array1) || !isSet(array2)) { return null; } // 先统计array2中不重复元素的个数 int uniqueCount = 0; for (int num : array2) { boolean isDuplicate = false; for (int num1 : array1) { if (num == num1) { isDuplicate = true; break; } } if (!isDuplicate) { uniqueCount++; } } // 创建结果数组并填充 int[] unionArray = new int[array1.length + uniqueCount]; System.arraycopy(array1, 0, unionArray, 0, array1.length); int index = array1.length; for (int num : array2) { boolean isDuplicate = false; for (int num1 : array1) { if (num == num1) { isDuplicate = true; break; } } if (!isDuplicate) { unionArray[index++] = num; } } return unionArray; }
三、代码说明
- 核心逻辑:完全贴合你的设计思路——保留array1所有元素,筛选出array2中与array1无重复的元素,最后拼接得到并集数组。
- 边界处理:当输入数组不是集合时,返回
null(你可以根据业务需求改成抛出异常)。 - 效率优化:isSet方法找到重复元素立即返回,union方法避免了冗余的计数逻辑,用更直观的方式筛选元素。
内容的提问来源于stack exchange,提问作者Laith.jas
相关产品推荐
相关产品推荐

