问题描述
小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制:
- 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行
n / 2场比赛,且产生n / 2支队伍进入下一轮。 - 如果当前队伍数为 奇数,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行
(n - 1) / 2场比赛,且产生(n - 1) / 2 + 1支队伍进入下一轮。
小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。
测试样例
样例1:
输入:
n = 7
输出:6
样例2:
输入:
n = 14
输出:13
样例3:
输入:
n = 1
输出:0class Main { public static int solution(int n) { // 如果当前队伍数为1,直接返回0 if (n == 1) { return 0; }
// 计算当前轮次的配对次数
int pairs = n / 2;
// 计算剩余队伍数
int remainingTeams = (n % 2 == 0) ? n / 2 : n / 2 + 1;
// 递归计算下一轮的配对次数,并加上当前轮次的配对次数
return pairs + solution(remainingTeams);
}
public static void main(String[] args) {
System.out.println(solution(7) == 6);
System.out.println(solution(14) == 13);
System.out.println(solution(1) == 0);
}
}
解题思路
-
理解问题:我们需要计算在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。
-
数据结构选择:由于我们只需要计算配对次数,不需要实际模拟比赛过程,因此不需要复杂的数据结构。
-
算法步骤:
-
如果当前队伍数
n为 1,则直接返回 0。 -
否则,计算当前轮次的配对次数:
- 如果
n为偶数,配对次数为n / 2,剩余队伍数为n / 2。 - 如果
n为奇数,配对次数为(n - 1) / 2,剩余队伍数为(n - 1) / 2 + 1。
- 如果
-
将剩余队伍数作为下一轮的队伍数,继续计算配对次数,直到队伍数为 1
-
关键步骤解释
-
-
递归终止条件:当
n为 1 时,直接返回 0。 -
计算配对次数:根据
n的奇偶性计算当前轮次的配对次数。 -
递归调用:将剩余队伍数作为参数,递归调用
solution函数,并将当前轮次的配对次数累加到结果中。
如何处理奇数队伍的轮空情况? 处理奇数队伍的轮空情况是这个问题的关键部分。让我们来看看如何在代码中处理这种情况。
解题思路
-
理解问题:当队伍数为奇数时,会有一支队伍轮空并直接晋级到下一轮。
-
数据结构选择:我们只需要计算配对次数,因此不需要复杂的数据结构。
-
算法步骤:
-
如果当前队伍数
n为 1,则直接返回 0。 -
否则,计算当前轮次的配对次数:
- 如果
n为偶数,配对次数为n / 2,剩余队伍数为n / 2。 - 如果
n为奇数,配对次数为(n - 1) / 2,剩余队伍数为(n - 1) / 2 + 1。
- 如果
-
将剩余队伍数作为下一轮的队伍数,继续计算配对次数,直到队伍数为 1。
-