比赛赢家解析| 豆包MarsCode AI刷题

61 阅读4分钟

题目

小M正在玩一个数组比赛游戏,游戏规则如下:每回合游戏都在所有元素互不相同的数组 arr 的前两个元素 arr[0] 和 arr[1] 之间进行。较大的整数将会取得这一回合的胜利并保留在位置 0,而较小的整数则会被移至数组的末尾。比赛继续,直到某个整数连续赢得 k 次,这个整数即为比赛的赢家。

给定一个整数数组 arr 和一个整数 k,请你返回赢得比赛的整数。题目数据保证游戏中一定存在赢家。

代码

    # 初始化当前的赢家和连续赢的次数
    current_winner = arr[0]
    win_count = 0
    
    # 循环比较直到某个元素连续赢了k次
    while win_count < k:
        # 比较前两个元素
        if arr[0] > arr[1]:
            # 如果第一个元素较大,增加其连续赢的次数
            win_count += 1
            # 将较小的元素移到数组末尾
            arr.append(arr.pop(1))
        else:
            # 如果第二个元素较大,更新赢家并重置连续赢的次数
            current_winner = arr[1]
            win_count = 1
            # 将较小的元素移到数组末尾
            arr.append(arr.pop(0))
    
    # 返回连续赢了k次的元素
    return current_winner

if __name__ == '__main__':
    print(solution(arr=[2, 1, 3, 5, 4, 6, 7, 9], k=2) == 5)
    print(solution(arr=[3, 2, 1, 4], k=10) == 4)
    print(solution(arr=[1, 9, 8, 7, 6, 5, 4, 3, 2, 11], k=7) == 9)

代码解释

  1. 函数定义与参数

    def solution(arr: list, k: int) -> int:
    
    • solution 函数接受两个参数:arr 是一个整数列表,k 是一个整数。
    • 函数返回一个整数,表示赢得比赛的整数。
  2. 初始化变量

    current_winner = arr[0]
    win_count = 0
    
    • current_winner 初始化为数组的第一个元素 arr[0],表示当前的赢家。
    • win_count 初始化为 0,表示当前赢家连续赢的次数。
  3. 循环比较

    while win_count < k:
    
    • 循环条件是 win_count < k,即直到某个元素连续赢了 k 次。
  4. 比较前两个元素

    if arr[0] > arr[1]:
        win_count += 1
        arr.append(arr.pop(1))
    else:
        current_winner = arr[1]
        win_count = 1
        arr.append(arr.pop(0))
    
    • 如果 arr[0] > arr[1]
      • 增加 win_count,表示当前赢家连续赢的次数增加。
      • 将较小的元素 arr[1] 移到数组末尾,使用 arr.append(arr.pop(1))
    • 如果 arr[0] <= arr[1]
      • 更新 current_winnerarr[1],表示新的赢家。
      • 重置 win_count1,表示新的赢家开始连续赢。
      • 将较小的元素 arr[0] 移到数组末尾,使用 arr.append(arr.pop(0))
  5. 返回结果

    return current_winner
    
    • 当循环结束时,返回连续赢了 k 次的元素 current_winner
  6. 测试代码

    if __name__ == '__main__':
        print(solution(arr=[2, 1, 3, 5, 4, 6, 7, 9], k=2) == 5)
        print(solution(arr=[3, 2, 1, 4], k=10) == 4)
        print(solution(arr=[1, 9, 8, 7, 6, 5, 4, 3, 2, 11], k=7) == 9)
    
    • 这部分代码用于测试 solution 函数,确保其输出符合预期。

总结

  • 代码的核心是通过不断比较数组的前两个元素,调整数组顺序,并记录当前赢家的连续赢次数,直到某个元素连续赢了 k 次。
  • 通过这种方式,最终找到并返回赢得比赛的整数。

知识点总结

1. 数组操作

  • 数组索引:通过索引访问数组中的元素,例如 arr[0]arr[1]
  • 数组切片:虽然代码中没有直接使用切片,但理解切片操作有助于更灵活地处理数组。
  • 数组元素的移动:使用 arr.append(arr.pop(1))arr.append(arr.pop(0)) 将数组中的元素移动到末尾。

2. 循环与条件判断

  • while 循环:用于重复执行代码块,直到满足某个条件。在这个问题中,循环条件是 win_count < k
  • if-else 条件判断:用于根据条件执行不同的代码块。在这个问题中,根据 arr[0]arr[1] 的大小关系,决定如何更新 current_winnerwin_count

3. 变量与状态管理

  • 变量初始化:初始化 current_winnerwin_count,用于记录当前的赢家和连续赢的次数。
  • 变量更新:在每次循环中,根据比较结果更新 current_winnerwin_count

4. 函数定义与调用

  • 函数定义:定义一个名为 solution 的函数,接受两个参数 arrk,并返回一个整数。
  • 函数调用:在 if __name__ == '__main__': 块中调用 solution 函数,并打印结果。

5. 列表方法

  • append():将元素添加到列表的末尾。
  • pop():移除并返回列表中指定位置的元素。在这个问题中,pop(1)pop(0) 分别用于移除第二个和第一个元素。

6. 测试与验证

  • 测试用例:在 if __name__ == '__main__': 块中编写测试用例,验证函数的正确性。
  • 打印结果:使用 print 函数打印测试结果,确保输出符合预期。

总结

  • 这个问题的解决主要依赖于数组操作、循环与条件判断、变量与状态管理、函数定义与调用、列表方法以及测试与验证等知识点。