You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中编写函数删除数组中出现偶数次的元素

实现思路

首先明确规则:元素总出现次数为偶数时,删除该元素的所有出现;总出现次数为奇数时,保留该元素的所有出现。
具体实现分两个核心步骤:

  • 首先遍历原数组,统计每个元素的全局出现次数
  • 第二次遍历原数组,将出现次数为奇数的元素依次存入结果数组
  • 函数返回结果数组的有效长度,主函数按有效长度输出,避免打印垃圾值
原有代码的问题
  1. 变量counter未初始化,直接使用导致内存访问异常
  2. 条件判断count==1||count>1没有实现奇偶筛选逻辑,等于所有元素都满足条件
  3. 重复统计相同元素:遍历到相同值的不同位置时会重复计数、重复写入结果数组
  4. 函数没有返回结果数组的有效长度,主函数直接输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 20:45:03