数组交集求解C++代码输出异常:问题定位与修正咨询
数组交集代码问题排查与修正
问题概述
给定两个大小分别为n和m的数组arr1与arr2,求解数组的交集。编写的C++代码运行后输出结果与预期不符:
输入:
6
4
1 2 2 2 3 4
2 2 3 3
实际输出:2233
预期输出:223
错误定位
输入函数调用参数错误
main函数中调用inputarray时,错误使用了未定义的变量arr,正确参数应为arr1和arr2。这个错误会导致数组内容被错误赋值(甚至编译失败),是输出不符合预期的直接原因。潜在逻辑隐患
当前用INT_MIN标记已匹配元素的方式,仅适用于数组中无INT_MIN值的场景,不具备通用性;同时固定大小的数组可能在输入规模超出限制时引发越界问题。
修正方案
1. 修复输入函数调用
将main函数中的错误调用:
inputarray(arr,size1); inputarray(arr,size2);
替换为:
inputarray(arr1, size1); inputarray(arr2, size2);
2. 优化逻辑(可选,增强通用性)
如果需要处理包含INT_MIN的数组,或追求更高效的实现,可以改用哈希表统计元素出现次数:
- 先用哈希表记录arr2中每个元素的出现次数
- 遍历arr1,若元素在哈希表中存在且计数>0,则输出该元素并将计数减1
这种方法时间复杂度为O(n+m),且避免了修改原数组的问题。
修正后的完整代码
基础修复版(保留原逻辑,修复输入错误)
#include<iostream> #include<climits> using namespace std; void inputarray(int arr[], int size){ for(int i=0; i<size; i++){ cin >> arr[i]; } } void logic(int arr1[], int size1, int arr2[], int size2){ for(int i=0; i<size1; i++){ int element = arr1[i]; for(int j=0; j<size2; j++){ if(element == arr2[j]){ cout << element; arr2[j] = INT_MIN; break; } } } } int main(){ int arr1[100]; int arr2[100]; int size1; cin >> size1; int size2; cin >> size2; inputarray(arr1, size1); inputarray(arr2, size2); logic(arr1, size1, arr2, size2); return 0; }
优化版(哈希表实现)
#include<iostream> #include<unordered_map> using namespace std; void inputarray(int arr[], int size){ for(int i=0; i<size; i++){ cin >> arr[i]; } } void logic(int arr1[], int size1, int arr2[], int size2){ unordered_map<int, int> countMap; // 统计arr2中元素的出现次数 for(int i=0; i<size2; i++){ countMap[arr2[i]]++; } // 遍历arr1输出交集 for(int i=0; i<size1; i++){ if(countMap[arr1[i]] > 0){ cout << arr1[i]; countMap[arr1[i]]--; } } } int main(){ int size1, size2; cin >> size1 >> size2; int* arr1 = new int[size1]; int* arr2 = new int[size2]; inputarray(arr1, size1); inputarray(arr2, size2); logic(arr1, size1, arr2, size2); delete[] arr1; delete[] arr2; return 0; }
验证结果
修复输入错误后,运行基础版代码,输入给定测试用例,输出为223,与预期一致。
内容的提问来源于stack exchange,提问作者Harshvardhan Singh
相关产品推荐
相关产品推荐

