华为OD机试 - 奖牌榜排名(Java 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

2012年伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:

  1. 首先gold medal数量最多的排在前面;
  2. 其次silver medal数量最多的排在前面;
  3. 然后bronze medal数量最多的排在前面;
  4. 若以上三个条件仍无法区分名次,则以国家名称的字典顺序排定。

我们假设国家名称由通过二十六个字母,各奖牌数据不超过100,且大于0。

二、输入描述

第一行输入一个整数N(0 < N < 21),代表国家数量;

然后接下来的N行,每行包含: 一个字符串Name表示各个国家的名称和三个整数Gi, Si, Bi表示每个国家获得的gold medal, silver medal, bronze medal的数量,以空格隔开,如China 51 20 21。

具体见样例输入。

5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0

三、输出描述

按照奖牌榜的依次顺序,只输出国家名称,每行占一行,具体如下:

示例输出:

China
Rusia
France
Japan
England

四、测试用例

测试用例1:

1、输入

4
Germany 10 10 10
Austria 10 10 10
Belgium 10 10 10
Denmark 10 10 10

2、输出

Austria
Belgium
Denmark
Germany

3、说明

测试用例2:

1、输入

6
India 15 20 25
Australia 15 20 20
NewZealand 15 20 25
SouthAfrica 10 30 40
Italy 15 25 20
Spain 15 20 25

2、输出

Italy
India
NewZealand
Spain
Australia
SouthAfrica

3、说明

五、解题思路

  1. 数据存储:首先,我们需要存储每个国家的名称及其金、银、铜牌数量。可以定义一个 Country 类来表示每个国家,其中包含名称和三种奖牌的数量。
  2. 排序规则:根据题目描述,排序需要按照以下优先级:
    • 金牌数量降序
    • 银牌数量降序
    • 铜牌数量降序
  3. 国家名称的字典顺序升序
    • 为了实现这一排序规则,可以让 Country 类实现 Comparable 接口,并在 compareTo 方法中按照上述规则进行比较。
  4. 数据结构:使用 ArrayList 来存储所有国家的信息。读取所有输入后,使用 Collections.sort 方法对列表进行排序。
  5. 输入输出:使用 Scanner 类读取输入,按照题目要求读取国家数量和每个国家的详细信息。排序后,按顺序输出每个国家的名称。
  6. 测试:在编写代码后,通过示例输入和自定义的五个测试用例来验证代码的正确性。

六、Java算法源码

public class OdTest {
    // 定义国家类,实现Comparable接口以便排序
    static class Country implements Comparable<Country> {
        String name; // 国家名称
        int gold;    // 金牌数量
        int silver;  // 银牌数量
        int bronze;  // 铜牌数量

        public Country(String name, int gold, int silver, int bronze) {
            this.name = name;
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
        }

        @Override
        public int compareTo(Country other) {
            // 按金牌数量降序
            if (this.gold != other.gold) {
                return other.gold - this.gold;
            }
            // 金牌相同,按银牌数量降序
            if (this.silver != other.silver) {
                return other.silver - this.silver;
            }
            // 银牌相同,按铜牌数量降序
            if (this.bronze != other.bronze) {
                return other.bronze - this.bronze;
            }
            // 三种奖牌数量都相同,按国家名称字典顺序升序
            return this.name.compareTo(other.name);
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取国家数量
        int N = scanner.nextInt();
        List<Country> countries = new ArrayList<>();

        // 读取每个国家的信息
        for (int i = 0; i < N; i++) {
            String name = scanner.next();
            int gold = scanner.nextInt();
            int silver = scanner.nextInt();
            int bronze = scanner.nextInt();
            countries.add(new Country(name, gold, silver, bronze));
        }

        // 对国家列表进行排序
        Collections.sort(countries);

        // 输出排序后的国家名称
        for (Country country : countries) {
            System.out.println(country.name);
        }

        scanner.close();
    }
}

七、效果展示

1、输入

7
India 15 20 25
Australia 15 20 15
NewZealand 15 10 25
SouthAfrica 10 30 40
Italy 15 25 20
Spain 15 40 25
China 20 30 40

2、输出

China
Spain
Italy
India
Australia
NewZealand
SouthAfrica

3、说明

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值