小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
输出:0你需要计算在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。比赛的规则是: 如果当前队伍数为偶数,每支队伍都会与另一支队伍配对,进行 n / 2 场比赛,产生 n / 2 支队伍进入下一轮。 如果当前队伍数为奇数,将会随机轮空并晋级一支队伍,其余的队伍配对,进行 (n - 1) / 2 场比赛,产生 (n - 1) / 2 + 1 支队伍进入下一轮。 解题思路 初始条件:如果队伍数 n 为 1,那么不需要进行任何比赛,直接返回 0。 递归或迭代:你可以使用递归或迭代的方式来计算总的配对次数。 如果 n 是偶数,进行 n / 2 场比赛,然后递归或迭代处理 n / 2 支队伍。 如果 n 是奇数,进行 (n - 1) / 2 场比赛,然后递归或迭代处理 (n - 1) / 2 + 1 支队伍。 累加比赛次数:在每次递归或迭代中,累加当前的比赛次数。 伪代码框架 java public static int solution(int n) { // 如果队伍数为1,直接返 回0 if (n == 1) { return 0; } // 计算当前轮的比赛次数 int currentMatches; if (n % 2 == 0) { currentMatches = n / 2; n = n / 2; } else { currentMatches = (n - 1) / 2; n = (n - 1) / 2 + 1; } // 递归计算剩余队伍的比赛 次数,并累加 return currentMatches + solution(n);} 你可以根据上述伪代码框架来实现你的代码。注意在递归或迭代过程中,如何处理奇数和偶数队伍数的情况,并正确累加比赛次数。 初始条件检查: java if (n == 1) { return 0;}
如果队伍数 n 为 1,直接返回 0,因为不需要进行任何比赛。 计算当前轮的比赛次数: java int currentMatches;if (n % 2 == 0) { currentMatches = n / 2; n = n / 2;} else { currentMatches = (n - 1) / 2; n = (n - 1) / 2 + 1;}
根据队伍数 n 的奇偶性,计算当前轮的比赛次数,并更新 n 为下一轮的队伍数。 递归计算并累加: java return currentMatches + solution(n);
递归调用 solution 函数,计算剩余队伍的比赛次数,并累加当前轮的比赛次数。