下面是我参与青训营入营考核写的题解。 首先贴上AC代码:
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
代码说明:
-
初始化:
- 通过
win
变量表示当前回合的赢家,初始值为arr[0]
。 cnt
记录当前赢家连续获胜的次数。
- 通过
-
比赛模拟:
-
从数组的第二个元素开始遍历,每次比较当前赢家和下一个元素:
- 如果当前赢家大于下一个元素,赢家继续,
cnt
增加。 - 如果下一个元素大于当前赢家,更新赢家,并重置
cnt
为 1。
- 如果当前赢家大于下一个元素,赢家继续,
-
如果某个整数连续赢得了
k
次,则提前结束比赛并返回该整数。
-
-
边界情况:
- 如果
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
。