【中】小M的比赛胜场计算| 豆包MarsCode AI刷题

78 阅读3分钟

问题指路-->小M的比赛胜场计算 - MarsCode

问题描述

小M参加了一场n个人的比赛,比赛规则是所有选手两两对决。每个人有一个能力值,对应着他们的序号。参赛者同时被分为黄色或蓝色两种颜色。比赛胜负的规则如下:

  • 当比赛双方颜色不同时,能力值大的选手获胜;
  • 当比赛双方颜色相同时,能力值较小的选手获胜。

你需要帮助小M计算每个选手在比赛中能赢得的场数。


测试样例

样例1:

输入:n = 3, a = [0, 0, 1]
输出:[1, 0, 2]

  • 序号0和序号1比赛时,颜色相同,故序号0获胜。
  • 序号0和序号2比赛时,颜色不同,故序号2获胜。
  • 序号1和序号2比赛时,颜色不同,故序号2获胜。

样例2:

输入:n = 4, a = [1, 0, 1, 0]
输出:[1, 2, 1, 2]

样例3:

输入:n = 5, a = [0, 1, 0, 1, 0]
输出:[2, 2, 2, 2, 2]

选手之间的胜负关系根据能力值的奇偶性和大小判断,最终结果为:[2, 2, 2, 2, 2]。

解题思路

假设有 n 个选手,每个选手的能力值存储在数组 a中。a[i] 表示第 i 个选手的能力值。我们需要在所有选手之间进行两两对决,根据比赛规则判断每个选手的胜负情况。

比赛的胜负规则可以总结为:

  • 不同颜色:能力值较大的选手获胜。
  • 相同颜色:能力值较小的选手获胜。

我们可以通过双层循环遍历每对选手,计算每个选手获胜的次数。 但是需要注意每个选手无法和自己进行比赛,因此需要排除和自己比赛的情况。

完整代码

import java.util.Arrays;

public class Main {

    public static int[] solution(int n, int[] a) {
        // 结果数组,用来存储每个选手获胜的次数
        int[] res = new int[n];

        // 双层循环遍历所有选手之间的比赛
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                // 跳过自己和自己比较
                if (i == j) continue; 
                // 比较选手i和选手j
                if (a[i] != a[j]) {
                    // 如果能力值不同且i > j,i赢
                    if (i > j) {
                        res[i]++;
                    }
                } else {
                    // 如果能力值相同且i < j,i赢
                    if (i < j) {
                        res[i]++;
                    }
                }
            }
        }
        return res;  // 返回每个选手能赢得的场数
    }

    public static void main(String[] args) {
        // 测试用例1
        System.out.println(Arrays.equals(solution(3, new int[]{0, 0, 1}), new int[]{1, 0, 2}));  // 输出 [1, 0, 2]

        // 测试用例2
        System.out.println(Arrays.equals(solution(4, new int[]{1, 0, 1, 0}), new int[]{1, 2, 1, 2}));  // 输出 [1, 2, 1, 2]

        // 测试用例3
        System.out.println(Arrays.equals(solution(5, new int[]{0, 1, 0, 1, 0}), new int[]{2, 2, 2, 2, 2}));  // 输出 [2, 2, 2, 2, 2]
    }
}

复杂度分析

  1. 时间复杂度
  • 外层循环和内层循环都遍历 n 个选手,因此时间复杂度为 O(n^2)。
  1. 空间复杂度
  • 需要一个 res数组来存储每个选手的获胜场数,因此空间复杂度为 O(n)。