青训营X豆包MarsCode 技术训练营 | 豆包MarsCode AI 刷题

68 阅读4分钟

题目解析

思路

这道比赛配对问题的核心思路在于模拟整个比赛流程,根据每一轮队伍数量的奇偶性来确定比赛的配对情况以及进入下一轮的队伍数量,不断循环这个过程,直到最终决出唯一的获胜队伍,也就是队伍数量变为 1 为止。每一轮我们都要计算该轮进行的比赛配对次数,并累加起来,最终得到总的配对次数。

例如,当队伍数量 n 为偶数时,按照赛制,每两支队伍配对,一共会进行 n / 2 场比赛,然后进入下一轮的队伍数量也就变为了 n / 2 支。而当 n 为奇数时,会随机轮空一支队伍,实际进行 (n - 1) / 2 场比赛,进入下一轮的队伍数量则是 (n - 1) / 2 + 1 支。通过不断重复这样的判断和计算,就能模拟出完整的比赛过程并得出结果。

public static int solution(int n) { 
int matches = 0;
// 模拟每一轮比赛直到剩下一个队伍
while (n > 1) { 
if (n % 2 == 0) {
// 队伍数为偶数,每两支队伍配对
matches += n / 2; n /= 2; 
// 进入下一轮的队伍数是 n / 2
} else { // 队伍数为奇数,随机轮空一支队伍
matches += (n - 1) / 2;
n = (n - 1) / 2 + 1; 
// 进入下一轮的队伍数是 (n - 1) / 2 + 1 
} 
} 
return matches;
} 
public static void main(String[] args) { 
// 测试样例 
System.out.println(solution(7) == 6); // 输出 true 
System.out.println(solution(14) == 13); // 输出 true
System.out.println(solution(1) == 0); // 输出 true }
}

代码详解

从给出的代码来看,首先定义了一个名为 solution 的静态方法,它接受一个表示队伍数量的整数参数 n,同时定义了一个变量 matches 用来记录总的比赛配对次数,初始值为 0 。然后进入一个 while 循环,只要队伍数量 n 大于 1 ,就持续模拟比赛过程。在循环内,通过 if - else 语句来判断 n 的奇偶性。

如果 n % 2 == 0 ,也就是 n 为偶数时,将当前轮的比赛配对次数 n / 2 累加到 matches 中,然后更新 n 的值为 n / 2 ,代表进入下一轮的队伍数量。要是 n 为奇数,也就是 n % 2!= 0 的情况,把当前轮的比赛配对次数 (n - 1) / 2 累加到 matches 中,接着更新 n 的值为 (n - 1) / 2 + 1 ,同样是进入下一轮的队伍数量情况。当循环结束,也就是队伍数量变为 1 时,函数返回记录的总的比赛配对次数 matches 。

在 main 方法中,还给出了几个测试样例,通过调用 solution 方法并对比结果与预期输出是否一致,来验证代码的正确性,比如输入 7 时输出 6 ,输入 14 时输出 13 等,这种测试方式是很常见且实用的,能帮助我们快速发现代码可能存在的逻辑问题。

知识总结

通过刷这道题,我们收获了几个重要的知识点以及对它们的理解。

一是关于循环和条件判断的灵活运用。在实际编程中,很多复杂的逻辑都需要通过循环去不断重复执行某段代码,同时根据不同的条件来进行不同的操作,就像这道题里根据队伍数量奇偶性去安排比赛配对和更新队伍数量一样。我们要善于根据问题的逻辑结构来构建合适的循环和条件判断语句,这需要我们对程序的执行流程有清晰的把控。

二是对于数学逻辑在编程中的体现有了更深的认识。赛制里涉及到根据队伍数量计算比赛场次和下一轮队伍数量,这本质上是数学运算和编程的结合。在面对这类问题时,我们要先把现实中的规则用数学式子准确地表达出来,再转化为代码逻辑,这要求我们有扎实的数学基础,并且能够在两种思维模式之间自如切换。

对于入门的同学,我的学习建议是,首先要把基础的语法知识掌握牢固,比如循环语句(for 、while 等)、条件判断语句(if - else 、switch 等)以及基本的数学运算操作在代码中的写法。然后多去分析类似这种具有实际场景的题目,尝试自己先梳理逻辑,再对照答案去完善思路,不要一开始就去看完整的代码解法,要锻炼自己独立思考和构建代码框架的能力。