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

调试统计数组元素频率的C++代码时出现Segmentation fault,求修复

问题修复:统计数组元素频率的段错误问题

错误原因分析

你的代码出现Segmentation Fault的核心原因是数组越界访问:

  • listCountFrequent初始化时的大小是nums.size(),但元素的最大频率可能等于nums.size()(比如测试用例{1},元素1的频率是1,而listCountFrequent的索引范围是0 ~ nums.size()-1,也就是0,此时访问listCountFrequent[1]就会越界)。
  • 另外,你在统计频率时修改原nums数组的操作完全没必要,反而会引入额外的迭代器风险和逻辑复杂度。

修复后的完整代码

#include<iostream>
#include<vector>
#include<unordered_map>

using namespace std ;

vector<int> topKFrequent(vector<int>& nums, int k) {
    // 最大频率可能等于nums.size(),所以size设为nums.size()+1,避免越界
    vector<vector<int>> listCountFrequent(nums.size() + 1);
    unordered_map<int,int> mapCountFrequent ;
    vector<int> results ;

    // 统计频率:直接遍历,不修改原数组
    for (int num : nums)
    {
        mapCountFrequent[num]++;
    }

    // 将元素按频率分组
    for (auto& pair : mapCountFrequent)
    {
        int num = pair.first;
        int freq = pair.second;
        listCountFrequent[freq].push_back(num);
    }

    // 从高到低取前k个元素
    for (int i = listCountFrequent.size() - 1; i >= 0; i--)
    {
        if(!listCountFrequent[i].empty())
        {
            for (int num : listCountFrequent[i])
            {
                results.push_back(num);
                if(--k <= 0) break;
            }
        }
        if(k <= 0) break;
    }

    return results ;
}

int main()
{
    vector<int> nums = {1};
    int k = 1;

    // 只调用一次topKFrequent,避免重复修改原数组
    vector<int> res = topKFrequent(nums, k);
    for (int num : res)
    {
        cout << num << " " ;
    }
}

关键修复点

  1. 修正频率容器的大小:将listCountFrequent的初始化大小改为nums.size() + 1,确保能容纳最大频率(等于数组长度)的元素分组。
  2. 简化频率统计逻辑:直接遍历原数组统计频率,不再修改nums,避免了迭代器失效和索引混乱的问题。
  3. 优化结果收集逻辑:遍历unordered_map的键值对来分组元素,比原代码遍历修改后的nums更可靠。
  4. 避免重复调用函数:main函数中先保存结果再遍历,避免多次调用topKFrequent导致原数组被反复修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:52:57