如何修改C语言代码找出整数数组中全部最高频率元素?
问题分析与代码修正
你的代码存在三个核心问题导致无法输出所有高频元素:
- 计数器未逐次重置:
counter变量在循环外初始化,导致每次迭代时会累加之前元素的计数,造成频率计算错误。 - 频率计算不准确:仅统计当前元素之后的重复次数,未包含元素本身,导致实际频率少算1次。
- 仅存储单个高频元素:用
mostFreq单一变量存储结果,无法保留多个频率相同的元素。
以下是修正后的代码,采用结构体存储唯一元素及其频率的方式,清晰高效地输出所有高频元素:
#include <stdio.h> #include <string.h> #define n 6 // 定义结构体存储元素及其出现频率 typedef struct { int element; int count; } ElementFreq; int main() { int a[n] = {1,2,3,1,2,4}; ElementFreq freq[n]; int uniqueCount = 0; // 第一步:统计每个唯一元素的出现频率 for (int i = 0; i < n; i++) { int isExist = 0; // 检查当前元素是否已被统计 for (int j = 0; j < uniqueCount; j++) { if (freq[j].element == a[i]) { freq[j].count++; isExist = 1; break; } } // 未统计过则新增记录 if (!isExist) { freq[uniqueCount].element = a[i]; freq[uniqueCount].count = 1; uniqueCount++; } } // 第二步:找出最高频率值 int maxFreq = 0; for (int j = 0; j < uniqueCount; j++) { if (freq[j].count > maxFreq) { maxFreq = freq[j].count; } } // 第三步:输出所有频率等于最高频率的元素 printf("出现频率最高的元素是:"); for (int j = 0; j < uniqueCount; j++) { if (freq[j].count == maxFreq) { printf("%d ", freq[j].element); } } printf("\n"); return 0; }
代码说明
- 结构体存储:用
ElementFreq结构体记录每个唯一元素及其出现次数,避免重复统计。 - 三次遍历:第一次遍历统计所有元素的频率,第二次遍历找出最高频率,第三次遍历输出所有符合条件的元素。
- 去重处理:在统计阶段检查元素是否已存在,确保每个元素只被统计一次。
运行该代码后,输入数组{1,2,3,1,2,4}会输出出现频率最高的元素是:1 2 ,符合预期。
内容的提问来源于stack exchange,提问作者Luka Bitsadze
相关产品推荐
相关产品推荐

