问题描述
小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制:
- 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行
n / 2场比赛,且产生n / 2支队伍进入下一轮。 - 如果当前队伍数为 奇数,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行
(n - 1) / 2场比赛,且产生(n - 1) / 2 + 1支队伍进入下一轮。
小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。
测试样例
样例1
输入:`n = 7`
输出:`6`
样例2
输入:`n = 14`
输出:`13`
样例3
输入:`n = 1`
输出:`0`
解题思路
-
首先要理解清楚题目所说的意思;
-
初始条件:如果队伍数
n为 1,则不需要进行任何比赛,直接返回 0。 -
循环处理:
- 如果当前队伍数
n为偶数,进行n / 2场比赛,队伍数变为n / 2。 - 如果当前队伍数
n为奇数,进行(n - 1) / 2场比赛,队伍数变为(n - 1) / 2 + 1。
- 如果当前队伍数
-
累计比赛次数:在每次循环中,累计当前轮次的比赛次数。
-
终止条件:当队伍数变为 1 时,循环结束。
详细实现
def solution(n: int) -> int:
matches = 0
while n > 1:
if n % 2 ==0: #当n为偶数时
matches += n / 2
n = n / 2
else: #当n为奇数时
matches += (n - 1) / 2
n = (n - 1) / 2 + 1
return matches #返回matches
if __name__ == '__main__':
print(solution(7) == 6)
print(solution(14) == 13)
print(solution(1) == 0)
代码解释
matches = 0初始化为0;matches += n / 2在每次循环中,累计当前的比赛次数(在n为偶数时),matches += (n - 1) / 2即n为奇数时;
借鉴
如果有和我不同思路的友友们,可以在评论区留言,留下你的思路和代码,一起学习一下!