C++统计数组元素重复次数时无法识别大于12数值的问题
问题原因
- 核心bug在统计重复项的遍历逻辑:原代码用
for (int i = 0; i <= n; i++)生成待统计的目标值,本质是只检查0到数组长度n之间的整数。本次测试用例数组长度n=12,循环最大只会校验到数值12,数组中值为13的元素根本不在遍历范围内,自然无法统计它的重复次数。 - 该逻辑本身存在设计缺陷:默认数组内的元素值一定不超过数组长度,只要元素值大于n就会漏统计,和数组是否排序没有任何关系。
- 附带的小问题:循环条件写
i <= n本身存在边界风险,另外你写的双层循环排序是降序逻辑,不过你也提到排序不影响统计结果,这个问题不会触发计数异常。
修复方法
不要用数组下标值作为待统计的目标,改为遍历数组内实际存在的元素,增加已统计标记避免同一个数值重复输出即可。
修复后的可运行代码:
#include <iostream> using namespace std; int Count(int r[], int n, int x) { int res = 0; for (int i = 0; i <n; i++) if (x == r[i]) res++; return res; } int main() { int count = 0; int r[12] = { 1, 1, 2, 3, 4, 5, 6, 6, 7, 8,13,13 }; int n = sizeof(r) / sizeof(r[0]); // 排序逻辑可保留,不影响最终统计结果 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (r[i] > r[j]) { swap(r[i], r[j]); } } } // 标记数组,记录对应数值是否已经完成统计,避免重复输出相同数值的统计结果 bool visited[1000] = {false}; for (int i = 0; i < n; i++) { int curVal = r[i]; if (visited[curVal]) { continue; } int repeatNum = Count(r, n, curVal); if (repeatNum >= 2) { count++; cout << "number" << curVal << "-" << repeatNum << " Recurrences" << endl; } visited[curVal] = true; } cout << "count is " << count; return 0; }
修复后程序会正确识别所有数值(包括大于12的13)的重复次数,运行输出为:
number1-2 Recurrences number6-2 Recurrences number13-2 Recurrences count is 3
内容的提问来源于stack exchange,提问作者jim
相关产品推荐
相关产品推荐

