You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现int数组union方法:检测交集并构建无重复合并数组

问题分析与修正方案

我来帮你梳理当前代码里的问题,然后给出贴合你设计思路的修正实现:

一、当前代码存在的核心问题

  1. isSet方法效率低下:
    原方法中即使找到重复元素,仍会继续循环遍历,没有提前终止判断。虽然逻辑结果是对的,但可以优化得更高效。

  2. union方法中array3未填充有效元素:
    你只初始化了array3的长度,但完全没有把array2中与array1不重复的元素存入其中,直接拼接后这部分元素都是默认的0,完全不符合预期。

  3. 未处理非集合的边界情况:
    当任意一个输入数组不是集合时,当前代码会返回一个长度错误且元素未正确初始化的数组,没有做合理的异常处理。

  4. 重复元素计数逻辑冗余:
    原代码通过双层循环统计重复次数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:46:26