C语言统计数组重复值时如何避免同一值被重复计数
问题根源
你的代码核心问题是外层循环没有跳过已经完成统计的重复元素:当你统计完arr[6]对应的所有9之后,外层循环还会继续走到arr[7]、arr[8]的9,再次触发统计逻辑,导致重复输出。此外还有两处语法错误需要先修正。
修正后代码(基于原有逻辑调整)
// 去掉宏定义的多余等号 #define NUM 9 int main() { // 补全数组的int类型声明 int arr[NUM] = {1, 3, 4, 9, 2, 9, 2, 9, 7}; sort_int_array(arr, NUM); //插入排序函数保持不变 int i = 0, j, count; while (i < NUM) { count = 1; // 统计当前元素的重复次数 for (j = i + 1; j < NUM && arr[i] == arr[j]; j++) { count++; } // 仅输出重复次数大于1的元素 if (count > 1) { printf("%d instances of %d\n", count, arr[i]); } // 直接跳转到下一个不同元素的位置,避免重复统计 i = j; } return 0; }
关键改动说明
- 修复语法错误:删除宏定义多余的等号,补全数组的
int类型声明 - 把外层for循环改成while循环,统计完当前值的所有重复项后,直接将索引跳转到下一个不同值的位置,从根源避免重复统计
- 把重复判断移到内层循环结束后统一处理,避免数组末尾的重复元素无法触发输出的问题
- 每次统计新元素时才初始化count,避免计数混乱
更高效的优化方案(仅需单层循环)
因为数组已经排序,相同元素连续排列,完全可以去掉内层循环,仅用一层遍历完成统计,时间复杂度O(n):
#define NUM 9 int main() { int arr[NUM] = {1, 3, 4, 9, 2, 9, 2, 9, 7}; sort_int_array(arr, NUM); int count = 1; for (int i = 1; i < NUM; i++) { if (arr[i] == arr[i-1]) { count++; } else { if (count > 1) { printf("%d instances of %d\n", count, arr[i-1]); } count = 1; } } // 处理数组末尾的最后一组重复元素 if (count > 1) { printf("%d instances of %d\n", count, arr[NUM-1]); } return 0; }
内容的提问来源于stack exchange,提问作者OffensiveBandit
相关产品推荐
相关产品推荐

