比赛的赢家——豆包MarsCode刷题题解

17 阅读2分钟

下面是我参与青训营入营考核写的题解。 首先贴上AC代码:

image.png

1. 题目大意

小M正在玩一个数组比赛游戏,规则如下:每回合比较数组 arr 中的前两个元素 arr[0]arr[1],较大的整数将保留在位置0,较小的整数被移至数组末尾。比赛继续,直到某个整数连续赢得 k 次,那个整数即为比赛的赢家。

2. 解决思路

  • 比赛从数组的前两个元素开始,比较它们的大小,较大的元素保留在数组前面,较小的元素被移至数组末尾。
  • 每当一个整数赢得比赛时,计数器 cnt 增加。如果某个整数连续赢得 k 次,那么该整数就被认为是比赛的赢家。
  • 由于数组中的元素互不相同,且题目数据保证一定存在赢家,可以直接进行比赛模拟,直到某个整数连续赢得 k 次为止。

3. 代码实现

def solution(arr: list, k: int) -> int:
    n = len(arr)

    # 如果 k 大于数组的长度,直接返回最大元素
    if k > n:
        return max(arr)
    
    win = arr[0]  # 当前回合的赢家
    cnt = 0  # 连续获胜次数
    
    # 遍历数组,进行比赛
    for i in range(1, n):
        if win > arr[i]:
            cnt += 1  # 如果当前赢家赢了,增加连续获胜次数
        else:
            win = arr[i]  # 否则,更新赢家为当前元素
            cnt = 1  # 连续获胜次数重置为1
        
        if cnt >= k:  # 如果某个整数连续赢得了 k 次,比赛结束
            break
        
    return win  # 返回最后的赢家

if __name__ == '__main__':
    # 测试样例
    print(solution(arr=[2, 1, 3, 5, 4, 6, 7, 9], k=2) == 5)  # 输出:5
    print(solution(arr=[3, 2, 1, 4], k=10) == 4)  # 输出:4
    print(solution(arr=[1, 9, 8, 7, 6, 5, 4, 3, 2, 11], k=7) == 9)  # 输出:9

代码说明:

  1. 初始化

    • 通过 win 变量表示当前回合的赢家,初始值为 arr[0]
    • cnt 记录当前赢家连续获胜的次数。
  2. 比赛模拟

    • 从数组的第二个元素开始遍历,每次比较当前赢家和下一个元素:

      • 如果当前赢家大于下一个元素,赢家继续,cnt 增加。
      • 如果下一个元素大于当前赢家,更新赢家,并重置 cnt 为 1。
    • 如果某个整数连续赢得了 k 次,则提前结束比赛并返回该整数。

  3. 边界情况

    • 如果 k 大于数组的长度,直接返回数组中的最大元素。

测试结果:

  • 样例1:[2, 1, 3, 5, 4, 6, 7, 9], k=2 结果为 5
  • 样例2:[3, 2, 1, 4], k=10 结果为 4
  • 样例3:[1, 9, 8, 7, 6, 5, 4, 3, 2, 11], k=7 结果为 9