leecode-C语言实现-1619. 删除某些元素后的数组均值

一、题目
在这里插入图片描述
在这里插入图片描述
二、解题思路
(1)方法一之计数法
通过题目要求0 <= arr[i] <= 10的5次方,元素最大值为100000,最小值为0,我们可以初始化一个长度为100000的数组b,记录题目中给的数组a中各元素出现的值。在遍历数组b中的元素,剔除前百分之五x和后百分之五y,例如判断前百分之五时,需要考虑x小于、等于、大于第一个下标不为0的情况,我这里不建议大家使用这种方法,
第一:效率一般。
第二:判断逻辑有些复杂,代码不清晰,比较绕。
举例:
数组a:
数据:1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3

数组b:
索引:0,1,2,3,4,5,6,7,8,。。。。。。。。。。。。。。。
数据:0,1,18,0,0,0,0,0,0,。。。。。。。。。。。。。。。

(2)方法二之排序法–冒泡
将题目中给的数组a进行排序,取5%到95%之的值,再算平均数,但排序效率没有自带库函数qsort效率高。

(3)方法二之排序法–qsort

三、虚机测试代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void main()
{
    double trimMean(int* arr, int arrSize);
    void PrintfArr(int *arr, int size);
    unsigned int arr[] = {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3};
    int arrSize = sizeof(arr) / sizeof(int);

    //PrintfArr(arr, arrSize);
    printf("%f\n",trimMean(arr, arrSize));
}

/*
20 <= arr.length <= 1000
arr.length 是 20 的 倍数 
0 <= arr[i] <= 10的5次方
*/

double trimMean(int* arr, int arrSize)
{
    int Compare(const void *p1, const void *p2);
    int i;
    double sum = 0;
    qsort(arr,arrSize,sizeof(int),Compare);
    for(i=0; i<(arrSize-arrSize/20); i++)
    {
        if(i >= arrSize/20)
        {
            sum += (double)arr[i];
        }
    }
    return sum / (double)(arrSize - arrSize / 20 * 2);
}

int Compare(const void *p1, const void *p2)
{
   int *ps1 = (int*)p1;
   int *ps2 = (int*)p2;
   return *ps1 - *ps2;
}

/*
double trimMean(int* arr, int arrSize)
{
    void bubble_sort_func_v0(int *array,int num);
    int i;
    int tmp = arrSize/20;
    double sum = 0;
    double cnt = (double)(arrSize - tmp * 2);
    bubble_sort_func_v0(arr,arrSize);

    for(i=0; i<(arrSize-tmp); i++)
    {
        if(i >= tmp)
        {
            sum = (double)arr[i] + sum;
            printf("index: %d, sum : %f, cnt : %f\n",i,sum,cnt);
        }    
    }
    return sum / cnt;
}

void bubble_sort_func_v0(int *array,int num)
{
    int i,j,temp_var;

    for(i=0;i<num-1;i++)
    {
        for(j=0;j<num-i-1;j++)
        {
            if(*(array+j)>*(array+j+1))
            {
                temp_var = *(array+j);
                *(array+j) = *(array+j+1);
                *(array+j+1) = temp_var;
            }
        }
    }
}
*/

/*
double trimMean(int* arr, int arrSize)
{
    void PrintfArr(int *arr, int size);

    int size = 100001;
    //int size = 11;
    unsigned int *arr_res = malloc(sizeof(int) * size);
    unsigned int cnt = 0;
    unsigned int sum = 0;
    unsigned int tmp = 0;
    unsigned int tmp1 = 0;
    int flg = 0;
    int m = 0;
    int i;
    unsigned int TmpArr[4] = {0};
    //TmpArr数组中分别存储着前百分之5的值、前百分之5值的个数、后百分之5的值、后百分之5值的个数
    TmpArr[1] = arrSize / 20;
    TmpArr[3] = arrSize - TmpArr[1];
     
    for(i<0; i<size; i++)
    {
        arr_res[i] = 0;
    }

    for(i=0; i<arrSize; i++)
    {
        arr_res[arr[i]]++;
    }

    for(i=0; i<size; i++)
    {
        if(arr_res[i] != 0)
        {
            printf("i : %d, arr_res[i] : %d, cnt : %d, sum : %d, TmpArr[1] : %d, TmpArr[3] : %d, tmp : %d, tmp1 : %d\n",i,arr_res[i],cnt,sum,TmpArr[1],TmpArr[3],tmp,tmp1);
            cnt = cnt + arr_res[i];
            sum = sum + (i * arr_res[i]);
            if(cnt < TmpArr[1] && (tmp == 0))
            {
                 printf("cnt < TmpArr[1] && (tmp == 0)\n");
                 TmpArr[0] = i * arr_res[i] + TmpArr[0];
                 tmp =  TmpArr[1] - arr_res[i] - tmp;
            }
            else if(cnt < TmpArr[1] && (tmp != 0))
            {
                 printf("cnt < TmpArr[1] && (tmp != 0)\n");
                 TmpArr[0] = i * arr_res[i] + TmpArr[0];
                 tmp =  tmp - arr_res[i];
            }
            else if(cnt == TmpArr[1] && (m == 0))
            {
                 printf("cnt == TmpArr[1]  && (m == 0)\n");
                 tmp =  0;
                 TmpArr[0] = i * arr_res[i] + TmpArr[0];
                 m = m + 1;
            }
            else if((cnt > TmpArr[1]) && (tmp != 0))
            {
                 printf("(cnt > TmpArr[1]) && (tmp != 0)\n");    
                 TmpArr[0] = i * tmp + TmpArr[0];
                 tmp = 0;
            }
            else if((cnt > TmpArr[1]) && (tmp == 0) && (m == 0))
            {
                 printf("(cnt > TmpArr[1]) && (tmp == 0) && (m == 0)\n");
                 TmpArr[0] = i * arr_res[i];
                 m = m + 1;
            }
            else if(cnt == TmpArr[3])
            {
                 printf("cnt == TmpArr[3]\n");
                 flg = 1;
            }
            else if((cnt > TmpArr[3]) && flg)
            {
                 printf("(cnt > TmpArr[3]) && flg\n");    
                 TmpArr[2] = i * arr_res[i] + TmpArr[2];
            }
            else if((cnt > TmpArr[3]) && (!flg))
            {
                 printf("(cnt > TmpArr[3]) && (!flg)\n");
                 tmp1 = cnt - TmpArr[3] - tmp1;
                 TmpArr[2] = i * tmp1 + TmpArr[2];
            }
            printf("i : %d, arr_res[i] : %d, cnt : %d, sum : %d, TmpArr[1] : %d, TmpArr[3] : %d, tmp : %d, tmp1 : %d\n",i,arr_res[i],cnt,sum,TmpArr[1],TmpArr[3],tmp,tmp1);
            printf("TmpArr[0] : %d, TmpArr[2] : %d\n",TmpArr[0],TmpArr[2]);
            printf("**********************\n");
        }
    }
    sum = sum - TmpArr[0] - TmpArr[2];
    cnt = cnt - TmpArr[1] - TmpArr[1];
    return (double)sum / (double)cnt;
}
*/

void PrintfArr(int *arr, int size)
{
    int i;
    for(i=0; i<size; i++)
    {
        printf("index: %3d, val : %3d\n",i,arr[i]);
    }
    printf("=============\n");
}

四、虚机测试截图
在这里插入图片描述

五、leecode提交代码
(1)方法一

double trimMean(int* arr, int arrSize)
{
    //void PrintfArr(int *arr, int size);

    int size = 100001;
    //int size = 11;
    unsigned int *arr_res = malloc(sizeof(int) * size);
    unsigned int cnt = 0;
    unsigned int sum = 0;
    unsigned int tmp = 0;
    unsigned int tmp1 = 0;
    int flg = 0;
    int m = 0;
    int i;
    unsigned int TmpArr[4] = {0};
    //TmpArr数组中分别存储着前百分之5的值、前百分之5值的个数、后百分之5的值、后百分之5值的个数
    TmpArr[1] = arrSize / 20;
    TmpArr[3] = arrSize - TmpArr[1];
     
    for(i<0; i<size; i++)
    {
        arr_res[i] = 0;
    }

    for(i=0; i<arrSize; i++)
    {
        arr_res[arr[i]]++;
    }

    for(i=0; i<size; i++)
    {
        if(arr_res[i] != 0)
        {
            //printf("i : %d, arr_res[i] : %d, cnt : %d, sum : %d, TmpArr[1] : %d, TmpArr[3] : %d, tmp : %d, tmp1 : %d\n",i,arr_res[i],cnt,sum,TmpArr[1],TmpArr[3],tmp,tmp1);
            cnt = cnt + arr_res[i];
            sum = sum + (i * arr_res[i]);
            if(cnt < TmpArr[1] && (tmp == 0))
            {
                 //printf("cnt < TmpArr[1] && (tmp == 0)\n");
                 TmpArr[0] = i * arr_res[i] + TmpArr[0];
                 tmp =  TmpArr[1] - arr_res[i] - tmp;
            }
            else if(cnt < TmpArr[1] && (tmp != 0))
            {
                 //printf("cnt < TmpArr[1] && (tmp != 0)\n");
                 TmpArr[0] = i * arr_res[i] + TmpArr[0];
                 tmp =  tmp - arr_res[i];
            }
            else if(cnt == TmpArr[1] && (m == 0))
            {
                 //printf("cnt == TmpArr[1]  && (m == 0)\n");
                 tmp =  0;
                 TmpArr[0] = i * arr_res[i] + TmpArr[0];
                 m = m + 1;
            }
            else if((cnt > TmpArr[1]) && (tmp != 0))
            {
                 //printf("(cnt > TmpArr[1]) && (tmp != 0)\n");    
                 TmpArr[0] = i * tmp + TmpArr[0];
                 tmp = 0;
            }
            else if((cnt > TmpArr[1]) && (tmp == 0) && (m == 0))
            {
                 //printf("(cnt > TmpArr[1]) && (tmp == 0) && (m == 0)\n");
                 TmpArr[0] = i * arr_res[i];
                 m = m + 1;
            }
            else if(cnt == TmpArr[3])
            {
                 //printf("cnt == TmpArr[3]\n");
                 flg = 1;
            }
            else if((cnt > TmpArr[3]) && flg)
            {
                 //printf("(cnt > TmpArr[3]) && flg\n");    
                 TmpArr[2] = i * arr_res[i] + TmpArr[2];
            }
            else if((cnt > TmpArr[3]) && (!flg))
            {
                 //printf("(cnt > TmpArr[3]) && (!flg)\n");
                 tmp1 = cnt - TmpArr[3] - tmp1;
                 TmpArr[2] = i * tmp1 + TmpArr[2];
            }
            //printf("i : %d, arr_res[i] : %d, cnt : %d, sum : %d, TmpArr[1] : %d, TmpArr[3] : %d, tmp : %d, tmp1 : %d\n",i,arr_res[i],cnt,sum,TmpArr[1],TmpArr[3],tmp,tmp1);
            //printf("TmpArr[0] : %d, TmpArr[2] : %d\n",TmpArr[0],TmpArr[2]);
            //printf("**********************\n");
        }
    }
    sum = sum - TmpArr[0] - TmpArr[2];
    cnt = cnt - TmpArr[1] - TmpArr[1];
    return (double)sum / (double)cnt;
}

(2)方法二

double trimMean(int* arr, int arrSize)
{   
    void bubble_sort_func_v0(int *array,int num);
    int i;
    int tmp = arrSize/20;
    double sum = 0;
    double cnt = (double)(arrSize - tmp * 2);
    bubble_sort_func_v0(arr,arrSize);
    
    for(i=0; i<(arrSize-tmp); i++)
    {   
        if(i >= tmp)
        {   
            sum = (double)arr[i] + sum;
            //printf("index: %d, sum : %f, cnt : %f\n",i,sum,cnt);
        }
    }
    return sum / cnt;
}

void bubble_sort_func_v0(int *array,int num)
{
    int i,j,temp_var;

    for(i=0;i<num-1;i++)
    {
        for(j=0;j<num-i-1;j++)
        {
            if(*(array+j)>*(array+j+1))
            {
                temp_var = *(array+j);
                *(array+j) = *(array+j+1);
                *(array+j+1) = temp_var;
            }
        }
    }
}

(3)方法三

double trimMean(int* arr, int arrSize)
{
    int Compare(const void *p1, const void *p2);
    int i;
    double sum = 0;
    qsort(arr,arrSize,sizeof(int),Compare);
    for(i=0; i<(arrSize-arrSize/20); i++)
    {
        if(i >= arrSize/20)
        {
            sum += (double)arr[i];
        }
    }
    return sum / (double)(arrSize - arrSize / 20 * 2);
}

int Compare(const void *p1, const void *p2)
{
   int *ps1 = (int*)p1;
   int *ps2 = (int*)p2;
   return *ps1 - *ps2;
}

六、leecode提交截图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值