给你一个不同学生的分数列表,请按 学生的 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
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;
}