算法每日一题:保龄球游戏的获胜者

大家好,我是星恒

今天的每一一题是一道简单题目,但是没能秒掉,原因就是题意理解不到位,边界问题没有判断清楚

不过这本来就是一个试错,迭代,积累经验的过程,加油加油,相信做多了,自然就可以秒掉啦!

题目:

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

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

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

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

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

返回

  • 如果玩家 1 的得分高于玩家 2 的得分,则为 1 ;

  • 如果玩家 2 的得分高于玩家 1 的得分,则为 2 ;

  • 如果平局,则为 0 。
    示例:
    示例 1:

    输入:player1 = [4,10,7,9], player2 = [6,5,2,3]
    输出:1
    解释:player1 的得分是 4 + 10 + 27 + 29 = 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 。

提示:

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

分析:

这道题最主要的事理解题意,注意他说的前两个元素为10,是说的任意元素的前两个元素

还有注意0,1的边界问题,要分类讨论,最后如果能合并就合并了

题解:

题解一:最无脑题解

java 复制代码
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;
    }
}

优化:(两种方式的本质是一样的,只是第二种的写法更优雅!)

java 复制代码
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如何使用 **条件运算符 **来表达
  • 边界0 和 1,如何更优雅的处理
    • 写出来后,看看能不能和主要处理函数合并
      • 0:当是0的时候,res 就是本身
      • 1:当是1的时候,两种情况(第一个为10,第一个不为10),如何判断呢,判断i - 1 是否为10
      • i > 0 && player[i - 1] == 10) || (i > 1 && player[i - 2] >= 10
      • 所以这个i > 0就很妙,一语双关,太妙了呀,不过说实话,不好想
    • 其实这里主要得到这个经验:
      • 当后面的计算和前两个有关时,一定要特殊判断第一个情况和第二个情况
相关推荐
Lenyiin14 分钟前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿29 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd29 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo61733 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v38 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A2 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神2 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人2 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.3 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划