給你一個不同學生的分數列表,請按 學生的 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;
}