大家好,我是星恒
今天的每一一题是一道简单题目,但是没能秒掉,原因就是题意理解不到位,边界问题没有判断清楚
不过这本来就是一个试错,迭代,积累经验的过程,加油加油,相信做多了,自然就可以秒掉啦!
题目:
给你两个下标从 0 开始的整数数组 player1 和 player2 ,分别表示玩家 1 和玩家 2 击中的瓶数。
保龄球比赛由 n 轮组成,每轮的瓶数恰好为 10 。
假设玩家在第 i 轮中击中 xi 个瓶子。玩家第 i 轮的价值为:
玩家的得分是其 n 轮价值的总和。
返回
输入: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:
输入: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:
输入:player1 = [2,3], player2 = [4,1]
输出:0
解释:player1 的得分是 2 + 3 = 5 。
player2 的得分是 4 + 1 = 5 。
player1 的得分等于 player2 的得分,所以这一场比赛平局,答案为 0 。
提示:
分析:
这道题最主要的事理解题意,注意他说的前两个元素为10,是说的任意元素的前两个元素
还有注意0,1的边界问题,要分类讨论,最后如果能合并就合并了
题解:
题解一:最无脑题解
class Solution {
public int isWinner(int[] player1, int[] player2) {
if (player1.length == 1) {
if (player1[0] > player2[0]) {
return 1;
} else if (player1[0] < player2[0]) {
return 2;
} else {
return 0;
}
}
int score1 = sumScore(player1);
int score2 = sumScore(player2);
if (score1 > score2) {
return 1;
} else if (score1 < score2) {
return 2;
} else {
return 0;
}
}
public int sumScore(int[] player) {
int score = 0;
if (player[0] == 10) {
score = player[0] + 2 * player[1];
} else {
score = player[0] + player[1];
}
for (int i = 2; i < player.length; i++) {
if (player[i - 1] == 10 || player[i - 2] == 10) {
score += 2 * player[i];
} else {
score += player[i];
}
}
return score;
}
}
优化:(两种方式的本质是一样的,只是第二种的写法更优雅!)
class Solution {
public int isWinner(int[] player1, int[] player2) {
int s1 = score(player1);
int s2 = score(player2);
return s1 == s2 ? 0 : s1 > s2 ? 1 : 2;
}
public int score(int[] player) {
int res = 0;
for (int i = 0; i < player.length; i++) {
if ((i > 0 && player[i - 1] == 10) || (i > 1 && player[i - 2] >= 10)) {
res += 2 * player[i];
} else {
res += player[i];
}
}
return res;
}
优化点:
if
如何使用 **条件运算符 **来表达i > 0 && player[i - 1] == 10) || (i > 1 && player[i - 2] >= 10