概述
题目:
给你一个整数数组salary
,数组里每个数都是 唯一 的,其中salary[i]
是第i
个员工的工资。
请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
提示:
3 <= salary.length <= 100
10^3 <= salary[i] <= 10^6
salary[i]
是唯一的。- 与真实值误差在
10^-5
以内的结果都将视为正确答案
方法一:
先写find_max_salary
函数找到数组中的最大数,然后写find_min_salary
函数找到数组中的最小数,再写sum_salary
函数计算出数组中数字的总和。最后在average
函数中首先求出数组总和,然后用总和减去所找到的数组中的最大值和最小值,最后再除以减去最大最小值后的数组长度。
int find_max_salary(int *salary, int salarySize)
{
int max = 0;
int i = 0;
while (i < salarySize){
if (max < salary[i])
max = salary[i];
i++;
}
return max;
}
int find_min_salary(int *salary, int salarySize)
{
int min = 1000000;
int i = 0;
while (i < salarySize){
if (min > salary[i])
min = salary[i];
i++;
}
return min;
}
double sum_salary(int *salary, int salarySize)
{
int sum = 0;
int i = 0;
while (i <= salarySize){
sum += salary[i];
i++;
}
return sum;
}
double average(int* salary, int salarySize){
int max = find_max_salary(salary, salarySize);
int min = find_min_salary(salary, salarySize);
double salary_sum = sum_salary(salary, salarySize);
int people_num = salarySize - 2;
return (salary_sum - max - min) / people_num
}
作者:aaa-206
链接:https://leetcode-cn.com/problems/average-salary-excluding-the-minimum-and-maximum-salary/solution/123456-by-aaa-206/
来源:力扣(LeetCode)
方法二:
首先将数组中第0位赋给max
,min
,sum
通过一个for循环,在for循环中i
表示数组下标。在数组中边查找极值,边计算和。
double average(int* salary, int salarySize){
int i, max, min;
double sum = 0;
sum = max = min = salary[0];
for(i=1; i<salarySize; i++)
{
if (salary[i] > max)
{
max = salary[i];
}
if (salary[i] < min)
{
min = salary[i];
}
sum += salary[i];
}
sum = sum - max - min;
return sum / (salarySize - 2);
}
作者:xiaowenzi
链接:https://leetcode-cn.com/problems/average-salary-excluding-the-minimum-and-maximum-salary/solution/bu-yong-liang-ci-xun-huan-bian-cha-zhao-ji-zhi-bia/
来源:力扣(LeetCode)
方法三:
所使用思想与前面的方法一致,也是给一个最小值(最大值),找到极值后计算和
#define INT_MAX 2147483647
#define INT_MIN -2147483648
double average(int* salary, int salarySize){
int sum = 0, max = INT_MIN, min = INT_MAX;
for (int i = 0; i < salarySize; ++i) {
sum += salary[i];
if (min > salary[i]) min = salary[i];
if (max < salary[i]) max = salary[i];
}
return (double)(sum - min - max) / (salarySize - 2);
}
作者:chen-xiang-yin
链接:https://leetcode-cn.com/problems/average-salary-excluding-the-minimum-and-maximum-salary/solution/c-yu-yan-4-ms-55-mb-by-chen-xiang-yin-4/
来源:力扣(LeetCode)
方法四:
使用qsort函数进行排序。
int cmp(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
double average(int* salary, int salarySize){
double sum = 0;
qsort(salary, salarySize, sizeof(int), cmp);
if (salarySize == 3) {
return salary[1];
}
for (int i = 1; i < salarySize - 1; ++i) {
sum += salary[i];
}
return sum / (salarySize - 2);
}
作者:Dint
链接:https://leetcode-cn.com/problems/average-salary-excluding-the-minimum-and-maximum-salary/solution/1491-qu-diao-zui-di-gong-zi-he-zui-gao-gong-zi-h-2/
来源:力扣(LeetCode)
根据此处所描述,关于qsort()函数原理如下:
函数原理:
void qsort(
void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *)
);
函数功能:qsort()
函数的功能是对数组进行排序,数组中有nmemb个元素,每个元素的大小为size。
参数base - base指向数组起始地址,通常该位置传入的是一个数组名
参数nmemb -nmemb表示该数组的元素个数
参数size -size表示该数组中每个元素的大小(字节数)
参数(compar)(const void,const void*)-此为只想比较函数的函数指针,决定了排序的顺序。
函数返回值:无
注意:如果两个元素的值是相同的,那么他们的前后顺序是不确定的。也就是说qsort()
是一个不稳定的排序算法。
在sqort()
排序中使用到的compar
参数是一个指向比较两个元素的函数。比较函数的原理如下。注意两个形参必须是const void*
型,同时在调用compar
函数(compar
实质为函数指针,这里称它所指向的函数也为compar
)时,传入的实参也必须转换成const void*
型。
在compar
函数内部将const void*
型转换成实际类型,如下所示:
int compar(const void *p1, const void *p2);
如果compar
返回值小于0(<0),那么p1所指向元素会被排在p2所指向元素的前面。
如果compar
返回值等于0(=0),那么p1所指向元素与p2所指向元素的顺序不确定。
如果compar
返回值大于0(>0),那么p1所指向元素会被排在p2所指向元素的后面。
因此,如果想让qsort()
进行从小到大(升序)排序,那么一个通用的compar
函数可以写成这样:
int comparMyType (const viod * a, const void * b)
{
if (*(MyType*)a < *(MyType*)b) return -1;
if (*(MyType*)a <= *(MyType*)b) return 0;
if (*(MyType*)a > *(MyType*)b) return 1;
}
注意:你要将MyType转换成实际数组元素的类型。
一个使用qsort()
函数的小例子:
#include<stdio.h> //printf的库函数
#include<stdlib.h> //qsort的库函数
int values[] = {40, 10, 100, 90, 20, 25};
int compare(comst void * a, const void * b)
{
return (*(int*)a - *(int*)b);
}
int main()
{
int n;
qsort(values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf("%d", values[n]);
return 0;
}
此处可以分析以下compar
函数。如果a
小于b
,则返回值为负数(<0),即a
会排在b
的前面。同理,若a
大于b
,则a
会排在b
的后面。所以,这里的qsort()
为从小到大即升序排序。因此,运行结果为:10 20 25 40 90 100
最后
以上就是坚定汽车为你收集整理的C语言学习记录LeetCode——去掉最低工资和最高工资后的平均工资(排序)的全部内容,希望文章能够帮你解决C语言学习记录LeetCode——去掉最低工资和最高工资后的平均工资(排序)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复