一、题目介绍
给你一个由 不同 整数组成的整数数组 arr
和一个整数 k
。
每回合游戏都在数组的前两个元素(即 arr[0]
和 arr[1]
)之间进行。比较 arr[0]
与 arr[1]
的大小,较大的整数将会取得这一回合的胜利并保留在位置 0
,较小的整数移至数组的末尾。当一个整数赢得 k
个连续回合时,游戏结束,该整数就是比赛的 赢家 。
返回赢得比赛的整数。
题目数据 保证 游戏存在赢家。
二、整体思路
1.map集合实现
根据要求,需要将arr[1]之后的整数整体前进一位,arr[0]和arr[1]中较小的数放到最后,我们比较大小我们可以直接使用Math类中的Max函数和Math函数然后定义一个数保存最大最小值。可以利用Map集合一个Key对应一个value的特点通过HashMap的containsKey方法判断是否包含,如果有,value就加一,当value达到k时返回。具体代码如下
package 数组游戏赢家;
import java.util.HashMap;
import java.util.Map;
public class GameWinnerMap {
public static int getWinner(int[] arr, int k) {
// 用于存储每个整数赢得的回合数
Map<Integer, Integer> winCounts = new HashMap<>();
while (true) {
// 比较前两个元素的大小
int winner = Math.max(arr[0], arr[1]);
int loser = Math.min(arr[0], arr[1]);
// 更新赢得回合数的计数器
if (winCounts.containsKey(winner)) {
winCounts.put(winner, winCounts.get(winner) + 1);
} else {
winCounts.put(winner, 1);
}
// 将输家移到数组末尾
arr[0] = winner;
for (int i = 2; i < arr.length; i++) {
arr[i - 1] = arr[i];
}
arr[arr.length - 1] = loser;
// 如果有整数赢得了 k 个连续回合,返回该整数
if (winCounts.get(winner) == k) {
return winner;
}
}
}
public static void main(String[] args) {
int[] arr = {2, 1, 3, 5, 4};
int k = 2;
int winner = getWinner(arr, k);
System.out.println("赢得比赛的整数是:" + winner);
}
}
2.for循环嵌套实现
package 数组游戏赢家;
/**
* @author DC
* @name Ex01
* 2024/5/19 19:20
*/
public class GaneWinnerFor {
public static int getWinner(int arr[],int k){
//回合数
int round = 0;
for (int i = 0; i < arr.length; i++) {
int temp = arr[1];
//将数组中arr[1]后每一个数循环向前
for (int j = 1; j < arr.length; j++) {
if (j==arr.length-1){
arr[arr.length-1]=temp;
}else {
arr[j] = arr[j+1];
}
}
if (arr[0]<arr[1]){
arr[1] = arr[0];
arr[0] = temp;
round=0;
}
round++;
//返回赢家
if (round==k){
return arr[0];
}
}
return 0;
}
public static void main(String[] args) {
int arr[] ={1,9,2,4,3};
System.out.println(getWinner(arr,2)+"就是本场比赛的赢家");
}
}
三、总结
该题为LeeCode上一道中等难度的算法题,本文利用两种方法解决了该题。第一种方法相比第二种在处理数据比较大的数组时效率更高,内存占用率较少。第二种方法逻辑简单通俗易懂在处理小规模数组时其实更加适合。