C++实现两数组交集:代码输出与预期不符的问题排查
问题分析与修复方案
你的代码思路方向是对的——用哈希表统计第一个数组中元素的出现次数,然后遍历第二个数组去匹配。但问题出在当某个元素的可用次数减到0后,你没有从哈希表中移除对应的键,导致后续再遇到这个元素时,mymap.count(input2[i])仍然会返回1(因为键还存在于map中),从而错误地重复输出该元素。
比如在你的示例输入里:
- 第一个数组的
2在map中初始计数是1 - 遍历第二个数组时,第一个
2被输出,计数减到0,但键2还留在map里 - 第二个
2过来时,mymap.count(2)还是1,所以又被输出了,这就不符合预期(因为第一个数组里只有1个2,交集里最多只能出现1次)
修复步骤
只需要在mymap[input2[i]]--;之后,加一个判断:如果计数减到0了,就把这个键从map中删除。这样后续再遇到相同元素时,count就会返回0,不会再输出。
修正后的代码
#include <iostream> #include <unordered_map> using namespace std; void intersection(int input1[], int input2[], int size1, int size2) { unordered_map<int,int> mymap; for(int i=0;i<size1;i++){ // 简化计数逻辑:访问不存在的键会自动初始化为0,直接自增即可 mymap[input1[i]]++; } for(int i=0; i<size2; i++){ if(mymap.count(input2[i]) > 0){ cout<<input2[i]<<" "; // 用空格分隔更直观,也可根据需求改为endl mymap[input2[i]]--; // 新增:计数为0时删除键,避免后续重复匹配 if(mymap[input2[i]] == 0){ mymap.erase(input2[i]); } } } } // 测试示例 int main() { int arr1[] = {2,6,8,5,4,3}; int arr2[] = {2,2,3,4,7,4,3}; intersection(arr1, arr2, 6,7); return 0; }
验证结果
运行修正后的代码,输入你给出的示例,输出会是:2 3 4,完全符合预期。
内容的提问来源于stack exchange,提问作者sigmax
相关产品推荐
相关产品推荐

