C语言数组重复元素计数函数结果异常问题求助
问题分析与解决方案
你的问题很典型——原代码统计的是所有重复元素对的数量,而不是你想要的重复元素的种类数(即出现次数≥2的元素有多少种)。
为什么原代码返回6?
咱们拿元素7举例,它在数组里出现了3次(索引1、6、10):
- 当
i=1时,j=6和j=10会各匹配一次,计数器+2 - 当
i=6时,j=10又会匹配一次,计数器+1
光7就贡献了3次计数,再加上45(1次)、64(1次)、0(1次),总和就是3+1+1+1=6,这就是你得到6的原因。
如何修复?
我们需要的是:只要某个元素出现过至少2次,就算它是一个重复元素,而且只统计一次。可以用两种思路:
- 标记已经统计过的元素,避免重复计数
- 使用哈希表(或数组,若元素范围已知)记录元素出现次数,最后统计次数≥2的元素数量
方法1:标记已统计的元素(适合小规模数组)
我们可以在找到一个重复元素后,用布尔数组标记后续相同的元素,避免重复计数。
修正后的代码:
int countDuplicates(int array[], int size) { int i, j; int counter = 0; // 用布尔数组标记是否已经统计过该元素 int counted[size]; // 初始化所有元素为未统计 for (i = 0; i < size; i++) { counted[i] = 0; } for (i = 0; i < size; i++) { // 如果当前元素已经被统计过,跳过 if (counted[i]) continue; int hasDuplicate = 0; for (j = i + 1; j < size; j++) { if (array[i] == array[j]) { hasDuplicate = 1; counted[j] = 1; // 标记后续重复元素为已统计 } } if (hasDuplicate) { counter++; } } return counter; }
方法2:用哈希表统计出现次数(更高效,适合大数组)
如果数组元素范围较大,或者追求更高效率,用数组模拟哈希表统计每个元素的出现次数,最后遍历统计次数≥2的元素数量(以下版本适配你的测试数组元素范围):
int countDuplicates(int array[], int size) { int count[201] = {0}; // 覆盖-100到100的元素,索引=元素+100 int counter = 0; for (int i = 0; i < size; i++) { int index = array[i] + 100; count[index]++; } for (int i = 0; i < 201; i++) { if (count[i] >= 2) { counter++; } } return counter; }
测试验证
用你的测试数组{45, 7, -3, 5, 11, 64, 7, 45, 3, -5, 7, 0, 34, 64, 0, 9, 2, -85, 14, 21}测试,两个修正后的函数都会返回4,正好符合你预期的结果。
内容的提问来源于stack exchange,提问作者Amirkh7
相关产品推荐
相关产品推荐

