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

C++求解数组元素配对数量代码输出异常问题排查求助

问题诊断与修复方案

核心错误原因

  • 未初始化的arr1遍历范围错误
    arr1用于存储已经统计过的唯一元素,仅前k个位置是有效存储值,剩余空间未初始化是随机垃圾值。原代码遍历整个长度为n的arr1做存在性判断,不仅会因为随机值导致判断错误,同时exist变量在匹配到已存在元素后没有及时重置为false,会导致后续所有元素都被误判为已处理,不再统计。
  • 内外层循环变量同名冲突
    统计元素出现次数的内层循环复用了外层的变量i,会直接篡改外层循环的计数,导致外层遍历跳过大量元素,统计结果完全错误。
  • 额外兼容性问题:代码使用了C++标准不支持的变长数组(VLA),属于GCC等编译器的扩展实现,跨平台运行会出错。

修复后代码

#include <iostream>
#include <vector>
using namespace std;

void sockMerchant(int arr[],int n){
    // 用vector替代变长数组,自动初始化
    vector<int> processed;
    int pairs=0;
    for(int i=0;i<n;i++){
        bool exist = false;
        // 只遍历已存储的有效元素
        for(int j=0;j<processed.size();j++){
            if(processed[j]==arr[i]){
                exist = true;
                break; // 找到就提前退出,不需要继续遍历
            }
        }
        if(!exist){
            int c=0;
            int x = arr[i];
            // 内层循环用独立变量m,避免和外层i冲突
            for(int m=0;m<n;m++){
                if(arr[m]==x){
                    c++;
                }
            }
            processed.push_back(x);
            pairs += c/2;
        }
    }
    cout << pairs;
}

int main() {
    int n;
    cin >> n;
    int* arr = new int[n];
    for(int i=0;i<n;i++){
        cin >> arr[i];
    }
    sockMerchant(arr,n);
    delete[] arr;
    return 0;
}

修复后的代码运行给定测试输入,输出结果为4,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:06:00