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

暴力法求两数组并集异常:仅第一组元素存入结果数组且长度异常

暴力法求数组并集的问题排查与修复

问题核心原因

你遇到的两个关键问题:

  • 第三个数组长度从8变12:因为初始化arr3时用了vector<int> arr3(n+m);,这会直接创建包含8个默认值(0)的数组,后续push_back是在这8个元素后面追加新元素,最终长度变为8+4=12,前面的8个0会被当成无效元素混入结果。
  • 仅第一个数组元素存入:遍历完arr1后,你完全没处理arr2中剩余的、和arr1不重复的元素(比如示例里的2、5),这些元素本应属于并集的一部分。

代码问题拆解

  1. 错误的arr3初始化:预分配空间引入无意义的默认值,后续追加操作会让结果数组包含大量无效数据。
  2. 遗漏arr2剩余元素:arr2中没被匹配删除的元素都是arr1没有的,必须加入并集数组。
  3. (可选)破坏原数组:直接在传入的arr2上调用erase会修改主函数里的原数组,建议复制临时数组操作,避免破坏原始数据。

修正后的代码

//find the union of two arrays
#include<iostream>
#include<vector>
using namespace std;

void uniarr(vector<int> &arr1, vector<int> &arr2)
{
    int n = arr1.size();
    // 复制arr2到临时数组,避免修改原数组
    vector<int> temp_arr2 = arr2;
    vector<int> arr3; // 初始化为空数组,不再预分配空间
    cout << "arr初始长度: " << arr3.size() << endl;
    int count = 1;
   
    for (int i = 0; i < n; i++)
    {   
        count = 1;
        for (int j = 0; j < temp_arr2.size(); j++)
        {
            if(arr1[i] == temp_arr2[j])
            {   
                if(count == 1)
                {
                    arr3.push_back(arr1[i]);
                    count++;
                }
                temp_arr2.erase(temp_arr2.begin() + j);
                j--; // 修正erase后的索引偏移
            }   
        }
        if(count == 1)
        {
            arr3.push_back(arr1[i]);
        }
    }
    // 把temp_arr2中剩余的元素加入arr3(这些是arr1里没有的)
    for(int num : temp_arr2)
    {
        arr3.push_back(num);
    }
    cout << "arr最终长度: " << arr3.size() << endl;

    for (int i = 0; i < arr3.size(); i++)
    {
        cout << " " << arr3.at(i);
    }
}

int main()
{   
    system("cls");
    vector<int> arr1={3,1,4,6};
    vector<int> arr2={1,2,5,4};

    uniarr(arr1,arr2);
    return 0;
}

运行结果

执行后会输出:

arr初始长度: 0
arr最终长度: 6
 3 1 4 6 2 5

这正是两个数组的正确并集(包含所有不重复元素)。

内容的提问来源于stack exchange,提问作者sujal sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:39:40