比赛配对问题问题描述 小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 支队伍进入下一轮。 数据结构选择 这个问题不需要复杂的数据结构,只需要一个简单的整数来记录当前的队伍数,并进行迭代计算。 以下是完整的代码实现: java class Main { public static int solution(int n) { // 初始化配对次数 int pairs = 0; // 当队伍数大于1时,继 续进行比赛 while (n > 1) { // 如果队伍数为偶 数 if (n % 2 == 0) { // 进行 n / 2 场比赛 pairs += n / 2; // 剩余 n / 2 支队伍 n /= 2; } else { // 如果队伍数 为奇数 // 进行 (n - 1) / 2 场 比赛 pairs += (n - 1) / 2; // 剩余 (n - 1) / 2 + 1 支队伍 n = (n - 1) / 2 + 1; } } // 返回总的配对次数 return pairs; } public static void main (String[] args) { System.out.println (solution(7) == 6); System.out.println (solution(14) == 13); System.out.println (solution(1) == 0); }} 代码解释初始化配对次数:使用一个变量 pairs 来记录总的配对次数。 迭代计算:使用 while 循环,当队伍数 n 大于 1 时,继续进行比赛。如果队伍数为偶数,进行 n / 2 场比赛,剩余 n / 2 支队伍。如果队伍数为奇数,进行 (n - 1) / 2 场比赛,剩余 (n - 1) / 2 + 1 支队伍。 返回结果:当队伍数减少到 1 时,返回总的配对次数 pairs。测试在 main 方法中,我们测试了三个样例: solution(7) 应该返回 6。 solution(14) 应该返回 13。 solution(1) 应该返回 0。
总结该代码通过迭代计算每次比赛的配对次数,直到只剩下一个队伍为止。通过累加每次的配对次数,最终得到总的配对次数。