C練題筆記之:Leetcode-1086. 前五科的均分(二維動態陣列)

2020-08-14 01:04:39

題目:

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