每日一题系列:扑克牌大小

链接:https://www.nowcoder.com/questionTerminal/0a92c75f5d6b4db28fcfa3e65e5c9b3f?toCommentId=12666232
来源:牛客网

扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王)😃
3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER
输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER
请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR

基本规则:
(1)输入每手牌可能是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其他情况,由输入保证两手牌都是合法的,顺子已经从小到大排列;
(2)除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)
(3)大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;
(4)输入的两手牌不会出现相等的情况。

答案提示:
(1)除了炸弹和对王之外,其他必须同类型比较。
(2)输入已经保证合法性,不用检查输入是否是合法的牌。
(3)输入的顺子已经经过从小到大排序,因此不用再排序了.

数据范围:保证输入合法

import java.util.*;
public class Main{
public static int findSpecial(String str){//特殊的手牌
        String[]arr=str.split(" ");//手牌是用空格分割的,我们这里把空格去掉
        if(arr.length==2){//对子或者大小王的情况
            if(arr[0].equals("joker")||arr[1].equals("joker")){
                //题目中说了,大小王是成对出现的,我们这里只要判断是不是0和1下标是joker即可
                return 1;//最高优先级
            }
        }else if(arr.length==4){//题目中规定4个只有炸弹
            return 2;//第二优先级
        }
        return 3;//其他的都是第三优先级——第三优先级的同类比较
    }

    public static int size(char x){//单张牌面大小
        //规定3 4 5 6 7 8 9 10 J  Q  K A  2 大小王成对出现,这里不考虑
        //对应1 2 3 4 5 6 7  8 9 10 11 12 13
        if(3<=x&&x<=10){
            return x-2;
        }
        switch (x){
            case 'J':
                return 9;
            case 'Q':
                return 10;
            case 'K':
                return 11;
            case 'A':
                return 12;
        }
        return 0;
    }

    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str=scanner.nextLine();
        String[] arr=str.split("-");//把两手牌用split分割开来
        String str1=arr[0];
        String str2=arr[1];
        int level1=findSpecial(str1);
        int level2=findSpecial(str2);
        if(level1==1||level2==1){//有一方出现双王
            if(level1==1){
                System.out.println(arr[0]);
            }else{
                System.out.println(arr[1]);
            }
            return;
        }else if(level1==2||level2==2){//没有双王,但是有一方有炸弹
            if(level1==2&&level2==2){//都是炸弹
                if(arr[0].charAt(0)>arr[1].charAt(0)){
                    System.out.println(arr[0]);
                }else{
                    System.out.println(arr[1]);
                }
                return;
            }
            if(level1==2||level2==2){//有一方是炸弹,另一方不是
                if(level1==2){
                    System.out.println(arr[0]);
                }else{
                    System.out.println(arr[1]);
                }
                return;
            }
        }else{//没有炸弹,没有双王,那就是同类型比较了
            String[] tmp1=str1.split(" ");//计算第一幅牌的个数
            String[] tmp2=str2.split(" ");//计算第二幅牌的个数
            if(tmp1.length!=tmp2.length){//牌个数不一样没法比
                System.out.println("ERROR");
            }else{//牌个数一样,个子,对子,三个比较牌面大小;顺子比较最小牌大小
                //也就是我们比第一张牌即可
                if(size(str1.charAt(0))>size(str2.charAt(0))){
                    System.out.println(str1);
                }else{
                    System.out.println(str2);
                }
            }
        }

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

劲夫学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值