调试统计数组元素频率的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 << " " ; } }
关键修复点
- 修正频率容器的大小:将
listCountFrequent的初始化大小改为nums.size() + 1,确保能容纳最大频率(等于数组长度)的元素分组。 - 简化频率统计逻辑:直接遍历原数组统计频率,不再修改
nums,避免了迭代器失效和索引混乱的问题。 - 优化结果收集逻辑:遍历
unordered_map的键值对来分组元素,比原代码遍历修改后的nums更可靠。 - 避免重复调用函数:main函数中先保存结果再遍历,避免多次调用
topKFrequent导致原数组被反复修改。
内容的提问来源于stack exchange,提问作者KhiTuKi
相关产品推荐
相关产品推荐

