186.小E的比赛得分计算
问题描述
小E正在参加一系列比赛,共有nn场比赛。赢得一场比赛可以获得1分,而如果连续赢得两场或更多比赛,第二场及之后的每一场比赛都会额外获得1分。现在,给定nn场比赛的结果,请计算小E的总分数。
思路解析
-
目标:这段代码旨在根据给定的比赛结果序列来计算总得分。规则是每赢得一场比赛(用
1表示)可以获得1分,并且如果当前处于连胜状态(连续赢得比赛,连胜次数大于1),每次赢得比赛除了基础的1分之外还能额外获得1分;而一旦输掉比赛(用0表示),连胜状态就会被重置。 -
主要变量:
total_score:用于累计总的得分情况,初始化为0,随着比赛结果的遍历不断更新。current_streak:用来记录当前的连胜次数,初始值也是0,每当赢得比赛连胜次数加1,输掉比赛则重置为0。
解题步骤
-
初始化变量:
- 首先定义了两个变量,
total_score被初始化为0,它将用于记录最终要返回的总分数;current_streak同样初始化为0,用来跟踪当前的连胜场次情况。
- 首先定义了两个变量,
-
遍历比赛结果序列:
-
通过
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开始计算。
- 若比赛结果为
-
-
-
返回总分数:
- 在遍历完整个比赛结果列表后,
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)