华为OD机试真题 JavaScript 实现【比赛评分】【2023 B卷 100分】,附详细解题思路

在这里插入图片描述

一、题目描述

一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。打分规则为每个评委对选手打分,最高分10分,最低分1分。

请计算得分最多的3位选手的编号。如果得分相同,则得分高分值最多的选手排名靠前(10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。

二、输入描述

第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。

第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。

三、输出描述

选手前3名的编号。

注:若输入为异常,输出-1,如M、N、打分不在范围内。

四、解题思路

题目要求计算得分最多的3位选手的编号,评委打分范围为1到10分,选手数量和评委数量在给定范围内。

我们可以使用一个自定义的Player类来表示选手,其中包含选手的编号、总分和每个评委的打分列表。首先,我们需要读取输入的评委数量和选手数量,并进行合法性校验。然后,读取每个评委对每个选手的打分,将评分信息存储在列表中。接下来,根据评分信息计算每个选手的总分,并创建Player对象存储选手信息。最后,按照题目要求进行排序,输出得分最高的3位选手的编号。

  1. 读取输入的评委数量和选手数量,进行合法性校验。如果不满足条件,直接输出-1并结束程序;
  2. 使用一个列表存储每个评委对每个选手的打分。遍历评委列表,读取每个评委对每个选手的打分,将打分信息存储在列表中;
  3. 创建一个空列表playerList,用于存储选手信息;
  4. 遍历选手列表,计算每个选手的总分,同时将每个选手的打分列表存储在playerList中;
  5. 使用Collections.sort对playerList进行排序;
  6. 输出得分最高的3位选手的编号,按照题目要求输出。

该算法通过读取评委和选手的打分信息,计算每个选手的总分,并按照总分和最高分数量进行排序,输出得分最高的3位选手的编号。算法的时间复杂度主要取决于排序的时间复杂度,为O(NlogN),其中N为选手的数量。

五、JavaScript算法源码

function findTopThreePlayers() {
    const readline = require('readline');

    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    rl.question('请输入评委数量和选手数量(以逗号分隔):', (input) => {
        const [judges, players] = input.split(',').map(Number);

        // 选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分
        if (judges < 3 || judges > 10 || players < 3 || players > 100) {
            console.log(-1);
            rl.close();
            return;
        }

        const scores = [];

        const getScores = (index) => {
            if (index === judges) {
                // 总分
                const totalScores = Array.from({length: players}, () => 0);
                for (let i = 0; i < judges; i++) {
                    for (let j = 0; j < players; j++) {
                        totalScores[j] += scores[i][j];
                    }
                }
                // 遍历选手列表,计算每个选手的总分,同时将每个选手的打分列表存储在playerList中
                const playerList = Array.from({length: players}, (_, index) => ({
                    index,
                    total: totalScores[index],
                    scores: scores.map(judgeScores => judgeScores[index])
                }));
                // 排序
                playerList.sort((a, b) => {
                    if (b.total !== a.total) {
                        return b.total - a.total;
                    }
                    for (let i = 10; i > 0; i--) {
                        const countA = a.scores.filter(score => score === i).length;
                        const countB = b.scores.filter(score => score === i).length;
                        if (countA !== countB) {
                            return countB - countA;
                        }
                    }
                    return 0;
                });

                // 输出得分最高的3位选手的编号
                const topThree = playerList.slice(0, 3).map(player => player.index + 1);
                console.log(topThree.join(','));
                rl.close();
                return;
            }

            rl.question(`请输入第${index + 1}个评委的${players}个分数(以逗号分隔):`, (input) => {
                const scoresForJudge = input.split(',').map(Number);
                scores.push(scoresForJudge);
                getScores(index + 1);
            });
        };

        getScores(0);
    });
}

findTopThreePlayers();

六、效果展示

华为OD机试真题 JavaScript 实现【比赛评分】【2023 B卷 100分】,附详细解题思路_第1张图片


下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,javascript,前端,vue.js)