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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:37:52