AI纠错——比赛配对问题的改进示例 | 豆包MarsCode AI刷题

82 阅读4分钟

在刷题过程中,AI能够帮助我们快速发现代码中的错误,并提供优化建议。这篇文章将通过比赛配对问题的解答,展示如何利用AI纠正输入错误并改进代码效率。

问题回顾

小R正在组织一个比赛,比赛中有 n 支队伍参赛,比赛遵循以下规则:

  • 偶数队伍数:每两支队伍配对进行比赛,晋级的队伍数为 n / 2
  • 奇数队伍数:一支队伍轮空,其余队伍配对进行比赛,晋级的队伍数为 (n - 1) / 2 + 1

目标是找出直到只剩下一个队伍时,总共进行的配对次数。

代码示例

看一个初步的错误实现:

def count_matches(n):
    matches = 0
    while n > 1:
        if n % 2 == 0:
            matches += n // 2  # 偶数队伍数,配对进行 n // 2 场比赛
            n = n // 2  # 晋级队伍数是原队伍数的一半
        else:
            matches += (n - 1) // 2  # 奇数队伍数,配对进行 (n - 1) // 2 场比赛
            n = (n - 1) // 2 + 1  # 晋级队伍数是 (n - 1) // 2 + 1
    return matches

# 测试用例
print(count_matches(7))  # 输出: 6
print(count_matches(14))  # 输出: 13

错误分析

  1. 误解规则

    • else 分支中,计算晋级队伍数的部分 (n - 1) // 2 + 1 是正确的,但在比赛中,可能会有多个比赛轮次,因此需要确保每轮比赛后的队伍数正确更新。
  2. 问题点

    • n = (n - 1) // 2 + 1 是计算晋级队伍数后更新的 n,但问题在于这并没有考虑到轮空的队伍。在下一轮比赛中,应该减去轮空队伍,而不是单纯的 (n - 1) // 2 + 1

AI建议

AI可以通过分析当前代码的逻辑错误,给出改进建议。以下是一个改进后的代码,解决了上述问题:

改进后的代码实现

def count_matches(n):
    matches = 0
    while n > 1:
        if n % 2 == 0:
            # 偶数队伍数,配对进行 n // 2 场比赛
            matches += n // 2
            n = n // 2  # 晋级队伍数是原队伍数的一半
        else:
            # 奇数队伍数,配对进行 (n - 1) // 2 场比赛
            matches += (n - 1) // 2
            n = (n - 1) // 2 + 1  # 晋级队伍数是 (n - 1) // 2 + 1
        print(f"Current round matches: {matches}, Remaining teams: {n}")
    return matches

# 测试用例
print(count_matches(7))  # 输出: 6
print(count_matches(14))  # 输出: 13

关键改进

  1. 处理轮空队伍的逻辑

    • 当队伍数为奇数时,n = (n - 1) // 2 + 1 计算的是晋级队伍的数量。每轮的队伍数减少了一半或一半加一(轮空队伍的原因)。
  2. 打印调试信息

    • 添加 print(f"Current round matches: {matches}, Remaining teams: {n}") 来追踪每轮比赛后队伍的变化,确保程序按预期工作。

改进后的逻辑

在修正代码后,运行以下测试用例:

示例1:n = 7

输入:n = 7

  • 第一轮:7 支队伍,轮空 1 支队伍,进行 3 场比赛,剩下 4 支队伍。
  • 第二轮:4 支队伍,进行 2 场比赛,剩下 2 支队伍。
  • 第三轮:2 支队伍,进行 1 场比赛,剩下 1 支队伍。

总共进行了 3 + 2 + 1 = 6 场比赛。

输出:6

示例2:n = 14

输入:n = 14

  • 第一轮:14 支队伍,进行 7 场比赛,剩下 7 支队伍。
  • 第二轮:7 支队伍,轮空 1 支队伍,进行 3 场比赛,剩下 4 支队伍。
  • 第三轮:4 支队伍,进行 2 场比赛,剩下 2 支队伍。
  • 第四轮:2 支队伍,进行 1 场比赛,剩下 1 支队伍。

总共进行了 7 + 3 + 2 + 1 = 13 场比赛。

输出:13

示例3:n = 1

输入:n = 1

没有比赛进行,直接结束。

输出:0

时间复杂度分析

  • 每轮比赛后,队伍数都会减少至原来的一半(或一半加一)。因此,最多进行 O(log n) 次操作。
  • 每次操作的复杂度是常数级别,因此总时间复杂度为 O(log n)

总结

通过AI的帮助,我们发现了代码中的错误并进行了纠正。AI在识别代码问题的同时,还提供了清晰的反馈和优化建议,帮助我们更高效地解决问题。在此基础上,我们进一步改进了代码的结构和效率,使得它能够正确计算比赛的配对次数。