如何修改C++程序以输出数组中所有最高频数字?
解决C++数组多最高频数字输出问题
嘿,我来帮你调整代码,实现输出所有出现频率最高的数字!你的原代码目前只能记录单个最高频数字,我们需要优化逻辑并修正几个问题,具体步骤如下:
原代码的问题分析
- 非标准变长数组:
int arr[arrSize]不符合C标准,C不允许用变量直接定义静态数组大小,建议用vector<int>替代。 - 数组越界:循环条件
i <= arrSize和j <= arrSize会访问数组外的内存(数组下标范围是0到arrSize-1),导致未定义行为。 - 仅记录单个最高频数字:每次更新最高频时只保存一个数字,无法收集所有同频的最高值。
- 重复统计:原代码会多次重复统计同一个数字的频率,效率较低(时间复杂度O(n²))。
修改后的代码实现
我们改用哈希表统计频率,效率更高且能轻松收集所有最高频数字:
#include <iostream> #include <vector> #include <unordered_map> using namespace std; int main() { int arrSize; cin >> arrSize; // 用vector存储输入数组,避免非标准变长数组问题 vector<int> arr(arrSize); for(int k = 0; k < arrSize; ++k) { cin >> arr[k]; } // 统计每个数字的出现频率 unordered_map<int, int> freqMap; for(int num : arr) { freqMap[num]++; } // 找出最大频率值 int maxFreq = 0; for(auto& pair : freqMap) { if(pair.second > maxFreq) { maxFreq = pair.second; } } // 收集所有频率等于maxFreq的数字并输出 cout << "出现频率最高的数字是:"; for(auto& pair : freqMap) { if(pair.second == maxFreq) { cout << pair.first << " "; } } cout << endl; return 0; }
代码说明
vector<int>存储数组:替代原有的非标准变长数组,保证代码的可移植性和安全性。unordered_map统计频率:遍历一次数组即可完成统计,时间复杂度O(n),比原代码的O(n²)高效很多。- 获取最大频率:遍历哈希表找到所有数字中的最高出现次数。
- 输出所有最高频数字:再次遍历哈希表,把所有出现次数等于最大频率的数字输出。
测试示例
输入:
11 7 7 7 0 2 2 2 0 9 9 9
输出:
出现频率最高的数字是:9 2 7
(注:unordered_map是无序的,输出顺序可能和输入顺序不同;如果需要按数字在原数组中首次出现的顺序输出,可以改用map或者额外记录顺序,比如用vector先保存所有唯一数字再统计频率)
内容的提问来源于stack exchange,提问作者Who123
相关产品推荐
相关产品推荐

