C练题笔记之:Leetcode-1086. 前五科的均分(二维动态数组)

题目:

给你一个不同学生的分数列表,请按 学生的 id 顺序 返回每个学生 最高的五科 成绩的 平均分。

对于每条 items[i] 记录, items[i][0] 为学生的 id,items[i][1] 为学生的分数。平均分请采用整数除法计算。

示例:

输入:[[1,91],[1,92],[2,93],[2,97],[1,60],[2,77],[1,65],[1,87],[1,100],[2,100],[2,76]]
输出:[[1,87],[2,88]]
解释:
id = 1 的学生平均分为 87。
id = 2 的学生平均分为 88.6。但由于整数除法的缘故,平均分会被转换为 88。

提示:

1 <= items.length <= 1000
items[i].length == 2
学生的 ID 在 1 到 1000 之间
学生的分数在 1 到 100 之间
每个学生至少有五个分数

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/high-five
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

C练题笔记之:Leetcode-1086. 前五科的均分(二维动态数组)_第1张图片

解题思路:

1,首先对二维数组进行排序:

       当items [i] [0] != items [i-1][0] 的时候说明是下一个学生了,两个学生之间的排序依据id从小到大排序。

       当items [i] [0] == items [i-1][0] 的时候说明是同一个学生不同课成绩,成绩从大到小排序,便于后面取最大的5门成绩

2,通过循环将id不同,统计学生数量。这就是二维数组的行数。

3,将每个学上前5课成绩取平均值存入返回的数组中。

4,有的学生可能不止有5门成绩,所以取完5门,要保证i到下一个学生id处

代码:

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 int compar(const void *a, const void *b)
 {
    if((*(int **)a)[0] != (*(int **)b)[0])
        //学生学好由低到高排序
        return (*(int **)a)[0] - (*(int **)b)[0];
    else
        //同一个学生的成绩由高到低排序 
        return (*(int **)b)[1] - (*(int **)a)[1];
 }
int** highFive(int** items, int itemsSize, int* itemsColSize, int* returnSize, int** returnColumnSizes){
    int i, index;
    int count = 1;
    //二维数组按照id顺序排序
    qsort(items, itemsSize, sizeof(items[0]), compar);
    //获取id数量
    for(i = 1; i < itemsSize; i++)
    {
        if(items[i][0] != items[i-1][0])
            count++;
    }
    int **retnum = (int **)malloc(sizeof(int *) * count);
    *returnSize = count;
    *returnColumnSizes = (int *)malloc(sizeof(int ) * count);
    for(i = 0, index = 0; i < itemsSize; )
    {
        retnum[index] = (int *)malloc(sizeof(int) * 2);
        (*returnColumnSizes)[index] =  *itemsColSize;
        int temp = items[i][0];
        retnum[index][0] = items[i][0];
        retnum[index][1] = (items[i][1] + items[i+1][1] + items[i+2][1] + items[i+3][1] + items[i+4][1])/5;
        i += 5;
        for(; i < itemsSize && items[i][0] == temp; i++);
        index++;
    }
    return retnum;
}

 

你可能感兴趣的:(C,刷题笔记)