【leetcode】-最高的前五科成绩的平均分

138 阅读1分钟

题目

给你一个不同学生的分数列表,请按 学生的 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

题解

const fiveHighAvg = (arr) => {
    // ◆学生 id 从小到大排序,分数从大到小排序
    arr.sort((a, b) => {
        return a[0] === b[0] ? b[1] - a[1] : a[0] - b[0]
    })
    let idArr = []
    let resArr = []
    // ◆获取学生 id 数组
    arr.forEach(item => {
        idArr.push(item[0])
    })
    // ◆ id 去重
    idArr = [...new Set(idArr)]
    // ◆把 id 和 平均分 塞到二维数组里面
    idArr.forEach(id => {
        let scoreArr = []
        let avgValue = 0
        arr.forEach(it => {
            if (id === it[0]) {
                scoreArr.push(it[1])
            }
        })
        avgValue = getAvg(scoreArr)
        resArr.push([id, avgValue])
    })
    return resArr

    // ◆封装平均数函数
    function getAvg(scoreArr) {
        let sumScore = scoreArr.slice(0, 5).reduce((sum, item) => sum += item, 0)
        let avgScore = parseInt(sumScore / 5)
        return avgScore
    }
}

// ◆测试用例
let s1 = [[1, 91], [1, 92], [2, 93], [2, 97], [1, 60], [2, 77], [1, 65], [1, 87], [1, 100], 
[2, 100], [2, 76]]
console.log(fiveHighAvg(s1));
// [ [ 1, 87 ], [ 2, 88 ] ]
let s2 = [[1, 90], [1, 90], [1, 80], [2, 80], [1, 60], [2, 75], [2, 65], [1, 99], [2, 100], [2, 87]]
console.log(fiveHighAvg(s2));
// [ [ 1, 83 ], [ 2, 81 ] ]
let s3 = [[1, 80], [1, 80], [1, 80], [2, 70], [1, 80], [2, 70], [2, 70], [1, 85], [2, 80], [2, 70]]
console.log(fiveHighAvg(s3));
// [ [ 1, 81 ], [ 2, 72 ] ]