力扣:保龄球游戏的获胜者

2660. 保龄球游戏的获胜者

一、题目

给你两个下标从 0 开始的整数数组 player1player2 ,分别表示玩家 1 和玩家 2 击中的瓶数。

保龄球比赛由 n 轮组成,每轮的瓶数恰好为 10

假设玩家在第 i 轮中击中 xi 个瓶子。玩家第 i 轮的价值为:

  • 如果玩家在该轮的前两轮的任何一轮中击中了 10 个瓶子,则为 2xi
  • 否则,为 xi

玩家的得分是其 n 轮价值的总和。

返回

  • 如果玩家 1 的得分高于玩家 2 的得分,则为 1
  • 如果玩家 2 的得分高于玩家 1 的得分,则为 2
  • 如果平局,则为 0

示例 1:

1
2
3
4
5
输入:player1 = [4,10,7,9], player2 = [6,5,2,3]
输出:1
解释:player1 的得分是 4 + 10 + 2*7 + 2*9 = 46
player2 的得分是 6 + 5 + 2 + 3 = 16
player1 的得分高于 player2 的得分,所以 play1 在比赛中获胜,答案为 1

示例 2:

1
2
3
4
5
输入:player1 = [3,5,7,6], player2 = [8,10,10,2]
输出:2
解释:player1 的得分是 3 + 5 + 7 + 6 = 21
player2 的得分是 8 + 10 + 2*10 + 2*2 = 42
player2 的得分高于 player1 的得分,所以 play2 在比赛中获胜,答案为 2

示例 3:

1
2
3
4
5
输入:player1 = [2,3], player2 = [4,1]
输出:0
解释:player1 的得分是 2 + 3 = 5
player2 的得分是 4 + 1 = 5
player1 的得分等于 player2 的得分,所以这一场比赛平局,答案为 0

提示:

  • n == player1.length == player2.length
  • 1 <= n <= 1000
  • 0 <= player1[i], player2[i] <= 10

二、解题

根据题意算出两个玩家n轮的总得分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
* @param {number[]} player1
* @param {number[]} player2
* @return {number}
*/
var isWinner = function (player1, player2) {
let player1Count=getPlayerCount(player1);
let player2Count=getPlayerCount(player2);
console.log(player1Count,player2Count)
if(player1Count>player2Count){
return 1;
}else if(player1Count<player2Count){
return 2;
}else{
return 0;
}
};
//单个玩家的n轮的总得分
var getPlayerCount = function (player) {
let res = 0;
for (let i = 0; i <player.length; i++) {
if (i < 1) {
res += player[i];
} else if (i >= 1 && (player[i - 1] == 10 || player[i - 2] == 10)) {
res += player[i] * 2;
} else {
res += player[i];
}
}
return res;
}

三、思想原理

本题较为简单,唯一的难点在于理解题目

题干中的

  • 如果玩家在该轮的前两轮的任何一轮中击中了 10 个瓶子,则为 2xi

很容易让人理解成了从第三轮开始才考虑得分翻倍的可能性,但其实从第二轮开始就存在得分翻倍的可能性了(当第一轮击中保龄球数为10时),所以判断得分翻倍条件成立时应该从i>=1开始。


力扣:保龄球游戏的获胜者
https://chen77.top/2023/12/27/leetcode/2660保龄球游戏的获胜者/
作者
小陈
发布于
2023年12月27日
许可协议