华为OD-德州扑克

题目描述
五张牌,每张牌由牌大小和花色组成,牌大小2~10、J、Q、K、A,牌花色为红桃、黑桃、梅花、方块四种花色之一。

判断牌型:

牌型1,同花顺:同一花色的顺子,如红桃2红桃3红桃4红桃5红桃6。
牌型2,四条:四张相同数字 + 单张,如红桃A黑桃A梅花A方块A + 黑桃K。
牌型3,葫芦:三张相同数字 + 一对,如红桃5黑桃5梅花5 + 方块9梅花9。
牌型4,同花:同一花色,如方块3方块7方块10方块J方块Q。
牌型5,顺子:花色不一样的顺子,如红桃2黑桃3红桃4红桃5方块6。
牌型6,三条:三张相同+两张单。

说明:

(1)五张牌里不会出现牌大小和花色完全相同的牌。
(2)编号小的牌型较大,如同花顺比四条大,依次类推。
(3)包含A的合法的顺子只有10 J Q K A和A 2 3 4 5;类似K A 2 3 4的序列不认为是顺子。

输入描述
输入由5行组成,每行为一张牌大小和花色,牌大小为2~10、J、Q、K、A,花色分别用字符H、S、C、D表示红桃、黑桃、梅花、方块。

输出描述
输出牌型序号,5张牌符合多种牌型时,取最大的牌型序号输出。

用例
在这里插入图片描述
题目解析
这道题应该是一道逻辑题,这道题目输入了五张牌,然后我们需要对这五张牌进行六种情况的分析,并且分析有优先级:

是否为同花顺
是否为四条
是否为葫芦
是否同花
是否为顺子
是否为三条
若满足了前面,则后面的就不需要再判断了。

另外,同花顺情况判断,其实就是 同花 + 顺子,因此在写代码时可以再拆下代码。

上面六种情况的判断,其实可以将五张牌的大小和花色分开来,分别检查。因此我将输入的五张牌的大小存入nums数组,花色存入colors数组。

其中顺子的判断,其实不关心花色,只关心牌大小,我们只需要为牌定义好大小后,进行大小升序排序,若后面一张牌的大小总是比其前面一张牌大1,则就是顺子。

另外还一个特殊情况,即‘A2345’也是顺子,这里我们给A定义的大小是14,因此nums升序排序后,只需要判断nums.join(‘’)是否和’2345A’相等,即可判定为顺子。

而四条的判断,也不关心花色,只关系牌大小,四条即 四个相同牌大小,一个不同牌大小。这个很好判断,我这里的方案是,new Set(nums)来去重,若去重后不是两张牌,那么就肯定不是四条,若有两张牌,则任取一张,看在nums中有几个,若为1个或4个,则可以判定为四条。

葫芦、三条的判定和四条类似。

同花的判定,即new Set(colors),若去重后只有一个花色,则判定为同花。

另外,本题没有说如果输入的五张牌都不满足上面六种情况时,该输出啥,一个可能是,用例保证输入的五张牌肯定满足上面六种情况之一,因此不需要考虑这种异常场景。一个可能是,出题人遗漏了这种情况的输出说明,我这里把不满足上面六种情况的输出自定义为0.

Java算法源码

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
   
  public static void main(String[] args) {
   
    Scanner sc = new Scanner(System.in);

    String[] nums = new String[5];
    String[] colors = new String[5];

    for (int i = 0; i < 5; i++) {
   
      nums[i] = sc.next();
      colors[i] = sc.next();
    }

    System.out.println(getResult(nums, colors));
  }

  public static int getResult(String[] nums, String[] colors) {
   
    Arrays.sort(nums, (a, b) -> cards(a) - cards(b));

    if (isShunzi(nums) && isTonghua(colors)) return 1;
    else if (isSitiao(nums)) return 2;
    else if (isHulu(nums)) return 3;
    else if (isTonghua(colors)) return 4;
    else if (isShunzi(nums)) return 5;
    else if (isSantiao(nums)) return 6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风吹沙丘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值