C++单轮遍历求数组最值及出现次数问题求助
一次遍历完成数组最值及出现次数统计的解决方案
嘿,我来帮你搞定这个问题!其实你离成功只差一点点——既然已经能统计最小值的出现次数,把同样的逻辑套用到最大值上就行,完全不需要排序,一次遍历就能搞定所有需求。
核心思路
我们只需要维护四个变量:
min_val:存储当前遍历到的最小值min_count:存储当前最小值的出现次数max_val:存储当前遍历到的最大值max_count:存储当前最大值的出现次数
遍历数组时,对每个元素做以下判断:
- 与最小值比较:
- 如果当前元素 <
min_val:更新min_val为当前元素,同时把min_count重置为1(因为这是新的最小值,第一次出现) - 如果当前元素 ==
min_val:min_count加1
- 如果当前元素 <
- 与最大值比较:
- 如果当前元素 >
max_val:更新max_val为当前元素,同时把max_count重置为1 - 如果当前元素 ==
max_val:max_count加1
- 如果当前元素 >
完整代码实现
#include <iostream> int main() { int a[] = {2, 3, 4, 2, 7, 4, 7, 2}; // 计算数组长度,避免硬编码提升灵活性 int arr_len = sizeof(a) / sizeof(a[0]); // 初始化变量:以第一个元素作为初始最小、最大值,次数为1 int min_val = a[0]; int min_count = 1; int max_val = a[0]; int max_count = 1; // 从第二个元素开始遍历数组 for (int i = 1; i < arr_len; ++i) { // 处理最小值统计逻辑 if (a[i] < min_val) { min_val = a[i]; min_count = 1; } else if (a[i] == min_val) { min_count++; } // 处理最大值统计逻辑 if (a[i] > max_val) { max_val = a[i]; max_count = 1; } else if (a[i] == max_val) { max_count++; } } // 输出最终结果 std::cout << "最小值: " << min_val << ",出现次数: " << min_count << std::endl; std::cout << "最大值: " << max_val << ",出现次数: " << max_count << std::endl; return 0; }
代码说明
- 数组长度通过
sizeof(a)/sizeof(a[0])计算,避免硬编码数组长度,适配不同长度的数组 - 初始值设置为数组第一个元素,确保从第二个元素开始就能正确进行比较和计数
- 每个元素仅需两次比较(与当前最小值、最大值),时间复杂度为O(n),空间复杂度为O(1),完全满足“仅一次遍历”的要求
运行这段代码,输出结果会是:
最小值: 2,出现次数: 3
最大值: 7,出现次数: 2
这样就完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者Pravissimo
相关产品推荐
相关产品推荐

