我是靠谱客的博主 坚定汽车,最近开发中收集的这篇文章主要介绍C语言学习记录LeetCode——去掉最低工资和最高工资后的平均工资(排序),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:

给你一个整数数组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 = 1000000int 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位赋给maxminsum通过一个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——去掉最低工资和最高工资后的平均工资(排序)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部