刷题的日常-最好的扑克手牌

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情

刷题的日常-2023年2月20号

一天一题,保持脑子清爽

最好的扑克手牌

来自leetcode的 2347 题,题意如下:

给你一个整数数组ranks和一个字符数组suit。你有5张扑克牌,第i张牌大小为ranks[i],花色为suits[i]

下述是从好到坏你可能持有的 手牌类型

  • 1、"Flush":同花,五张相同花色的扑克牌。
  • 2、"Three of a Kind":三条,有 3 张大小相同的扑克牌。
  • 3、"Pair":对子,两张大小一样的扑克牌。
  • 4、"High Card":高牌,五张大小互不相同的扑克牌。

请你返回一个字符串,表示给定的 5 张牌中,你能组成的 最好手牌类型

注意:返回的字符串 大小写 需与题目描述相同。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出两个数组 ranks 和 suit,分别代表牌的大小和花色
  • 两个数组的长度是一致的
  • 然后给出一系列的规则
  • 要求我们根据规则的内容,返回当前手牌能够组合出的最大 手牌类型

做题思路

题目给出的的规则其实很简单,要么按颜色的多少区分,要么按扑克的大小区分。那么我们分别记录颜色和大小即可。

扑克牌的花色只有四种,大小也只有13种,那么在我们做映射的时候,可以直接开辟大小为 4 的数组做颜色映射,开辟大小为 14 的数组做大小映射。然后扫描两个数组,统计大小 和 颜色的数量。最后通过统计数据,根据给出的规则返回数据即可。

步骤如下:

  • 开辟映射数组
  • 循环扫描给定的牌
  • 扫描过程中更新颜色 和 大小的最大值
  • 根据扫描结果返回数据

代码实现

代码实现如下:

public class Solution {
    public String bestHand(int[] ranks, char[] suits) {
        int[] sizeMap = new int[14], colorMap = new int[4];
        int colorMax = 0, sizeMax = 0, idx = -1;
        while (++idx < suits.length) {
            colorMax = Math.max(colorMax, ++colorMap[suits[idx] - 'a']);
            sizeMax = Math.max(sizeMax, ++sizeMap[ranks[idx]]);
        }
        if (colorMax > 4) {
            return "Flush";
        }
        if (sizeMax > 2) {
            return "Three of a Kind";
        }
        if (sizeMax == 2) {
            return "Pair";
        }
        return "High Card";
    }
}

image.png