暴力法求两数组并集异常:仅第一组元素存入结果数组且长度异常
暴力法求数组并集的问题排查与修复
问题核心原因
你遇到的两个关键问题:
- 第三个数组长度从8变12:因为初始化
arr3时用了vector<int> arr3(n+m);,这会直接创建包含8个默认值(0)的数组,后续push_back是在这8个元素后面追加新元素,最终长度变为8+4=12,前面的8个0会被当成无效元素混入结果。 - 仅第一个数组元素存入:遍历完arr1后,你完全没处理arr2中剩余的、和arr1不重复的元素(比如示例里的2、5),这些元素本应属于并集的一部分。
代码问题拆解
- 错误的arr3初始化:预分配空间引入无意义的默认值,后续追加操作会让结果数组包含大量无效数据。
- 遗漏arr2剩余元素:arr2中没被匹配删除的元素都是arr1没有的,必须加入并集数组。
- (可选)破坏原数组:直接在传入的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
相关产品推荐
相关产品推荐

