题目
小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)
代码解释
-
函数定义与参数
def solution(arr: list, k: int) -> int:solution函数接受两个参数:arr是一个整数列表,k是一个整数。- 函数返回一个整数,表示赢得比赛的整数。
-
初始化变量
current_winner = arr[0] win_count = 0current_winner初始化为数组的第一个元素arr[0],表示当前的赢家。win_count初始化为0,表示当前赢家连续赢的次数。
-
循环比较
while win_count < k:- 循环条件是
win_count < k,即直到某个元素连续赢了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))- 如果
arr[0] > arr[1]:- 增加
win_count,表示当前赢家连续赢的次数增加。 - 将较小的元素
arr[1]移到数组末尾,使用arr.append(arr.pop(1))。
- 增加
- 如果
arr[0] <= arr[1]:- 更新
current_winner为arr[1],表示新的赢家。 - 重置
win_count为1,表示新的赢家开始连续赢。 - 将较小的元素
arr[0]移到数组末尾,使用arr.append(arr.pop(0))。
- 更新
- 如果
-
返回结果
return current_winner- 当循环结束时,返回连续赢了
k次的元素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)- 这部分代码用于测试
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_winner和win_count。
3. 变量与状态管理
- 变量初始化:初始化
current_winner和win_count,用于记录当前的赢家和连续赢的次数。 - 变量更新:在每次循环中,根据比较结果更新
current_winner和win_count。
4. 函数定义与调用
- 函数定义:定义一个名为
solution的函数,接受两个参数arr和k,并返回一个整数。 - 函数调用:在
if __name__ == '__main__':块中调用solution函数,并打印结果。
5. 列表方法
append():将元素添加到列表的末尾。pop():移除并返回列表中指定位置的元素。在这个问题中,pop(1)和pop(0)分别用于移除第二个和第一个元素。
6. 测试与验证
- 测试用例:在
if __name__ == '__main__':块中编写测试用例,验证函数的正确性。 - 打印结果:使用
print函数打印测试结果,确保输出符合预期。
总结
- 这个问题的解决主要依赖于数组操作、循环与条件判断、变量与状态管理、函数定义与调用、列表方法以及测试与验证等知识点。