一、题目
二、解题思路
(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提交截图