如何在C语言中编写函数删除数组中出现偶数次的元素
实现思路
首先明确规则:元素总出现次数为偶数时,删除该元素的所有出现;总出现次数为奇数时,保留该元素的所有出现。
具体实现分两个核心步骤:
- 首先遍历原数组,统计每个元素的全局出现次数
- 第二次遍历原数组,将出现次数为奇数的元素依次存入结果数组
- 函数返回结果数组的有效长度,主函数按有效长度输出,避免打印垃圾值
原有代码的问题
- 变量
counter未初始化,直接使用导致内存访问异常 - 条件判断
count==1||count>1没有实现奇偶筛选逻辑,等于所有元素都满足条件 - 重复统计相同元素:遍历到相同值的不同位置时会重复计数、重复写入结果数组
- 函数没有返回结果数组的有效长度,主函数直接输出n个元素会打印无意义的初始值
修正后的精简实现代码
#include<stdio.h> // 函数返回结果数组的有效长度 int filterEvenOccurrence(int* arr, int* filter, int n) { int resLen = 0; // 第一步:统计每个元素的总出现次数 for(int i=0; i<n; i++) { int cnt = 0; for(int j=0; j<n; j++) { if(arr[i] == arr[j]) cnt++; } // 第二步:出现次数为奇数就存入结果数组 if(cnt % 2 == 1) { filter[resLen++] = arr[i]; } } return resLen; } int main() { int i, n; printf("Enter no of elements:"); scanf("%d", &n); int arr[n]; int filter[n]; printf("\nEnter Elements:"); for(i=0;i<n;i++) { scanf("%d", &arr[i]); } int resLen = filterEvenOccurrence(arr, filter, n); printf("\nOutput:"); for(i=0;i<resLen;i++) { printf("%d ", filter[i]); } return 0; }
可选优化(元素范围可控时)
如果已知数组元素的取值范围(比如元素都在0~1000之间),可以用计数数组把时间复杂度从O(n²)降到O(n):
int filterEvenOccurrence(int* arr, int* filter, int n) { int resLen = 0; int cnt[1001] = {0}; // 假设元素最大为1000 // 第一次遍历统计次数 for(int i=0; i<n; i++) cnt[arr[i]]++; // 第二次遍历筛选 for(int i=0; i<n; i++) { if(cnt[arr[i]] %2 ==1) filter[resLen++] = arr[i]; } return resLen; }
内容的提问来源于stack exchange,提问作者Kristofer
相关产品推荐
相关产品推荐

