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

132 阅读3分钟

186.小E的比赛得分计算

问题描述

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

思路解析

  • 目标:这段代码旨在根据给定的比赛结果序列来计算总得分。规则是每赢得一场比赛(用1表示)可以获得1分,并且如果当前处于连胜状态(连续赢得比赛,连胜次数大于1),每次赢得比赛除了基础的1分之外还能额外获得1分;而一旦输掉比赛(用0表示),连胜状态就会被重置。

  • 主要变量

    • total_score:用于累计总的得分情况,初始化为0,随着比赛结果的遍历不断更新。
    • current_streak:用来记录当前的连胜次数,初始值也是0,每当赢得比赛连胜次数加1,输掉比赛则重置为0

解题步骤

  1. 初始化变量

    • 首先定义了两个变量,total_score被初始化为0,它将用于记录最终要返回的总分数;current_streak同样初始化为0,用来跟踪当前的连胜场次情况。
  2. 遍历比赛结果序列

    • 通过for循环来遍历输入的比赛结果列表a中的每一个元素(用result变量来依次接收每个元素)。

    • 对于每一场比赛结果(即result的值)进行判断:

      • 赢得比赛的情况(result == 1

        • 当比赛结果为1,意味着赢得了这场比赛,此时先给total_score增加1分,因为赢一场比赛至少可以得1分。
        • 接着将current_streak的值加1,表示连胜场次增加了一次。
        • 然后再判断current_streak是否大于1,如果大于1,说明当前处于连胜状态(已经连续赢了不止一场),那就需要给total_score额外再增加1分,以体现连胜的额外得分奖励。
      • 输掉比赛的情况(result == 0

        • 若比赛结果为0,也就是输掉了比赛,此时直接把current_streak重置为0,因为连胜状态被中断了,下次赢比赛时连胜次数将重新从1开始计算。
  3. 返回总分数

    • 在遍历完整个比赛结果列表后,total_score中已经累计好了根据规则计算出的总分数,最后通过return语句将这个总分数返回,完成整个计算得分的过程。

复杂度分析

  • 时间复杂度: 代码里用 for 循环遍历列表 a,循环次数由列表长度 n 决定,循环里基本操作花的时间都固定,所以时间复杂度就是 O(n)n 是列表 a 的长度。
  • 空间复杂度: 只定义了两个固定大小的变量,不管输入列表 a 多长,占的内存空间都不变,所以空间复杂度是  O(1),是常数级别的。

Code

def solution(n: int, a: list) -> int:
    total_score = 0  # 初始化总分数
    current_streak = 0  # 初始化当前连胜次数
    
    for result in a:
        if result == 1:
            # 赢得比赛,增加总分数和连胜次数
            total_score += 1
            current_streak += 1
            if current_streak > 1:
                # 如果连胜次数大于1,额外增加总分数
                total_score += 1
        else:
            # 输掉比赛,重置连胜次数
            current_streak = 0
    
    return total_score  # 返回总分数

if __name__ == '__main__':
    print(solution(5, [1, 1, 1, 0, 1]) == 6)
    print(solution(3, [1, 0, 1]) == 2)
    print(solution(6, [1, 1, 0, 0, 1, 1]) == 6)
    print(solution(4, [0, 0, 1, 1]) == 3)