小E的比赛得分计算 | 豆包MarsCode AI刷题

39 阅读4分钟

问题描述

小E正在参加一系列比赛,共有n场比赛。赢得一场比赛可以获得1分,而如果连续赢得两场或更多比赛,第二场及之后的每一场比赛都会额外获得1分。现在,给定n场比赛的结果,请计算小E的总分数。

  1. 每赢得一场比赛可以获得1分。
  2. 如果连续赢得两场或更多比赛,第二场及之后的每一场比赛都会额外获得1分。

基于这个理解,设计一个算法来计算总分数。遍历比赛结果数组,并根据连续赢得比赛的情况来计算分数。

解题思路

  1. 初始化变量

    • totalScore 用于存储总分数。
    • currentStreak 用于记录当前连续赢得比赛的次数。
  2. 遍历比赛结果数组

    • 如果当前比赛赢了(即 a[i] == 1),增加 currentStreak 并根据 currentStreak 计算分数。
    • 如果当前比赛输了(即 a[i] == 0),重置 currentStreak
  3. 计算分数

    • 每赢得一场比赛,增加 totalScore
    • 如果 currentStreak 大于1,说明有连续赢得比赛的情况,需要额外增加分数。

代码提示

以下是代码的框架,其中关键步骤用注释标出:

public class Main {
    public static int solution(int n, int[] a) {
        int totalScore = 0;
        int currentStreak = 0;

        for (int i = 0; i < n; i++) {
            if (a[i] == 1) {
                // 赢得比赛
                currentStreak++;
                totalScore += 1; // 每赢得一场比赛,增加1分
                if (currentStreak > 1) {
                    // 如果连续赢得比赛,额外增加1分
                    totalScore += 1;
                }
            } else {
                // 输掉比赛,重置连续赢得比赛的次数
                currentStreak = 0;
            }
        }

        return totalScore;
    }

    public static void main(String[] args) {
        System.out.println(solution(5, new int[]{1, 1, 1, 0, 1}) == 6);
        System.out.println(solution(3, new int[]{1, 0, 1}) == 2);
        System.out.println(solution(6, new int[]{1, 1, 0, 0, 1, 1}) == 6);
        System.out.println(solution(4, new int[]{0, 0, 1, 1}) == 3);
    }
}

关键步骤

  1. 初始化变量totalScorecurrentStreak
  2. 遍历比赛结果数组:根据比赛结果更新 currentStreaktotalScore
  3. 计算分数:根据 currentStreak 判断是否需要额外增加分数。 好的,让我们来分析一下代码的时间复杂度和空间复杂度。

时间复杂度

  • 循环次数:代码中的 for 循环会遍历数组 a 中的每一个元素,因此循环的执行次数是 n,其中 n 是比赛的总场数。
  • 内部操作:在每次循环中,代码会执行一些简单的条件判断和赋值操作,这些操作的时间复杂度是常数时间 O(1)

因此,整个算法的时间复杂度是 O(n),其中 n 是比赛的总场数。

空间复杂度

  • 额外空间:代码中使用了两个整型变量 totalScorecurrentStreak,这两个变量占用的空间是常数级别的。
  • 输入空间:输入数组 a 的空间复杂度是 O(n),其中 n 是比赛的总场数。

因此,整个算法的空间复杂度是 O(n),其中 n 是比赛的总场数。

总结

  • 时间复杂度O(n),其中 n 是比赛的总场数。
  • 空间复杂度O(n),其中 n 是比赛的总场数。

学到的东西总结

  1. 算法设计
  • 设计算法步骤:在理解题目要求后,设计一个清晰的算法步骤是关键。对于这个问题,我们需要遍历比赛结果数组,并根据比赛结果更新总分数和连续赢得比赛的次数。
  • 选择合适的数据结构:在这个问题中,我们使用了一个整型数组来存储比赛结果,并使用了两个整型变量来记录总分数和连续赢得比赛的次数。
  1. 代码实现

    • 编写代码:根据设计的算法步骤,编写代码实现。在编写代码时,要注意代码的可读性和逻辑的清晰性。
    • 调试与测试:编写完代码后,通过测试样例来验证代码的正确性。如果发现错误,需要逐步调试代码,找出问题所在并进行修正。
  2. 时间与空间复杂度分析

    • 时间复杂度:通过分析代码的时间复杂度,可以了解算法在处理不同规模输入时的性能表现。对于这个问题,时间复杂度是 O(n),表明算法在处理较大规模输入时仍然具有较好的性能。
    • 空间复杂度:通过分析代码的空间复杂度,可以了解算法在处理不同规模输入时所需的额外空间。对于这个问题,空间复杂度是 O(n),表明算法在处理较大规模输入时所需的额外空间是线性的。