题解 | #扑克牌大小#

扑克牌大小

https://www.nowcoder.com/practice/d290db02bacc4c40965ac31d16b1c3eb

纯暴力解法 -- 按斗地主的方式比较就行

  • 获取输入的两幅牌 - 带有空格的输出形式 和 不带空格的比较形式
String [] str = in.nextLine().split("-"); // 带空格输出形式
String [] str1 = str[0].split(" "); // 去掉空格,两手牌进行比较的形式
String [] str2 = str[1].split(" "); // 去掉空格,两手牌进行比较的形式
  • 扑克牌中存在 J Q K A 2 joker JOKER 这7张牌,不能直接进行比较所以需要先转换一下。此处使用map,将大小存储在value中
private static Map<String, Integer> map = new HashMap<>();
        map.put("3", 3);
        map.put("4", 4);
        map.put("5", 5);
        map.put("6", 6);
        map.put("7", 7);
        map.put("8", 8);
        map.put("9", 9);
        map.put("10", 10);
        map.put("J", 11);
        map.put("Q", 12);
        map.put("K", 13);
        map.put("A", 14);
        map.put("2", 15);
        map.put("joker", 16);
        map.put("JOKER", 17);
        map.put("joker JOKER", 18);
  • 明确大小比较原则(单个、对子、三个、炸弹、顺子、两王)
  • 最大:两王
  • 同类型牌 : 比较第一张牌,谁大,输出谁
  • 不同类型牌
  • 炸弹 和 其他:输出炸弹
  • 其他 和 其他:ERROR
  • 如何比较 ?
  • 因为最大是两王,所以分为两种情况比较,有 两王的牌 和 其他牌
if (str[0].equals("joker JOKER") || str[1].equals("joker JOKER")) {
                System.out.println("joker JOKER");
            } 
  • 其他牌的比较前提:出的牌在规则内(即属于单个、对子、三个、炸弹、顺子),所以需要判断
  • 对子:两张牌相同;
  • 三个:三张牌相同;
  • 炸弹:四张牌相同;
  • 顺子:五张牌连续,且在 3 ~ A之间的牌
public static boolean samePk(String[] str) {
        int len = str.length;
        for (int i = 0; i < len - 1; i++) {
            if (!str[i].equals(str[i + 1])) {
                return false;  // 不相同,错误出牌-ERROR
            }
        }
        return true;
    }
public static boolean checkSequence(String[] a) {
        if (map.get(a[4]) > 14) {
            return false;
        }
        for (int i = 0; i < 4; i++) {
            if (map.get(a[i + 1]) - map.get(a[i]) != 1) {
                return false; // 不连续,错误出牌-ERROR
            }
        }
        return true;
    }
  • 确定手牌符合规则后,开始进行比较,可以分为2种情况 -- 出牌数量一样(同类型)和 出牌数量不一样(不同类型)
  • 牌数一样,比较首张牌的大小
  • 牌数不一样
  • 有炸弹 - 有 输出炸弹
  • 没有 - 错误出牌方式
public static boolean newCompare(String[] a, String[] b) {
        if (map.get(a[0]) > map.get(b[0])) {
            return true;
        }
        return false;
    }

下面为完整代码

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    private static Map<String, Integer> map = new HashMap<>();

    public static void main(String[] args) {
        map.put("3", 3);
        map.put("4", 4);
        map.put("5", 5);
        map.put("6", 6);
        map.put("7", 7);
        map.put("8", 8);
        map.put("9", 9);
        map.put("10", 10);
        map.put("J", 11);
        map.put("Q", 12);
        map.put("K", 13);
        map.put("A", 14);
        map.put("2", 15);
        map.put("joker", 16);
        map.put("JOKER", 17);
        map.put("joker JOKER", 18);

        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            // 划分两付手牌
            String [] str = in.nextLine().split("-");
            String [] str1 = str[0].split(" ");
            String [] str2 = str[1].split(" ");
            // 先判断是否有两王
            if (str[0].equals("joker JOKER") || str[1].equals("joker JOKER")) {
                System.out.println("joker JOKER");
            } else { // 无两王判断长度是否一样
                if (str1.length == str2.length) {
                    if (str1.length == 1) {  // 长度一样,单个牌比较
                        System.out.println(newCompare(str1, str2) ? str[0] : str[1]);
                    } else if (str1.length == 5) { // 长度一样,顺子 - 先比较是否连续
                        System.out.println(checkSequence(str1) &&
                                           checkSequence(str2) ? (newCompare(str1, str2) ? str[0] : str[1]) : "ERROR");
                    } else {  // 其他长度,先判断是否都一样,在比较大小
                        System.out.println(samePk(str1) &&
                                           samePk(str2) ? (newCompare(str1, str2) ? str[0] : str[1]) : "ERROR");
                    }
                } else {
                    // 长度不一样,但是有炸弹
                    if (str1.length == 4) {
                        System.out.println(samePk(str1) ? str[0] : "ERROR");
                    } else if (str2.length == 4) {
                        System.out.println(samePk(str2) ? str[1] : "ERROR");
                    } else {
                        System.out.println( "ERROR");
                    }
                }
            }
        }
    }
    /**
    * 判断打出的两个、三个、炸弹是否符合规则
    */
    public static boolean samePk(String[] str) {
        int len = str.length;
        for (int i = 0; i < len - 1; i++) {
            if (!str[i].equals(str[i + 1])) {
                return false;
            }
        }
        return true;
    }
    
    /**
    * 比较两幅手牌第一张牌的大小
    */
    public static boolean newCompare(String[] a, String[] b) {
        if (map.get(a[0]) > map.get(b[0])) {
            return true;
        }
        return false;
    }

    /**
    * 判断5张牌的情况下是否是顺子
    */
    public static boolean checkSequence(String[] a) {
        if (map.get(a[4]) > 14) {
            return false;
        }
        for (int i = 0; i < 4; i++) {
            if (map.get(a[i + 1]) - map.get(a[i]) != 1) {
                return false;
            }
        }
        return true;
    }
}

全部评论

相关推荐

2025-12-19 15:17
门头沟学院 Java
27届中九本,目前陆陆续续也面了很多家厂了,大厂面了字节、腾讯、虾皮还有几家中小厂,全是一面挂,只有字节进二面,二面也是秒挂了。知道自己能力很差,基本上大厂面试题只要问题不是八股文,出一些场景题或者真实情况下的一些问题就不太答得上来,我感觉大多数面试官看我项目都是学习性质的项目没有部署上线,也没有面对真实场景好像就对我的项目没啥兴趣了,项目也不太拷打,就问几个简单的八股或者直接另出一个系统设计题(比如字节、虾皮),有一家中厂问的八股啥的还让我介绍项目重点,我就介绍然后正常回答八股,他也不追问,但是莫名就是一面挂了,也想问问大家有什么星球上的项目推荐嘛。目前项目就是一个点评魔改加一个图库烂大街,昨天面的腾讯的面试官人很好,也给我指出了一些建议,希望我深耕一些技术的实际场景不要堆砌中间件还要加深计算机基础知识的学习。因为楼主不是科班的,数据结构因为学过,Hot100也刷烂了,算法只要不是很难问题应该不大,但是计算机网络操作系统完全没学过,面腾讯和虾皮的时候完全不会被拷打了,感觉这些知识也不好速成,加上最近要期末考试了,学习技术的时间也要压缩分担给课上突击一下期末。想先沉淀半个多月,度过期末再做个项目之后继续投,想问一下各位大佬有什么意见?真的有点迷茫,感觉还要学好多才能达到找实习的水平,如果一月还找不到就打算考研了,那些真实场景确实没有接触过考虑不到,但是我都没有工作经验感觉很难锻炼这方面,也想问问大家该怎么提高这种真实场景思维,谢谢各位佬。
纳斯卡可:哥们大厂不要乱面啊,这些都是有面评的。你下次再想去面试都不会给你约了
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务