题解 | #扑克牌大小#

扑克牌大小

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

面向对象的编程方式,代码量较多。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String input = sc.nextLine();
            String[] poker = input.split("-");
            if (poker.length != 2) {
                System.out.println("ERROR");
                return;
            }

            int result = compare(parse(poker[0]), parse(poker[1]));
            System.out.println(result == 1 ? poker[0] : result == -1 ? poker[1] : "ERROR");
        }
    }

    /**
     * compare two poker cards
     * @param poker1
     * @param poker2
     * @return 1 if first poker is larger; -1 if second poker is larger; 0 if not comparable
     */
    private static int compare(Poker poker1, Poker poker2) {
        PokerType p1 = poker1.type, p2 = poker2.type;
        if (p1 == PokerType.JOKER) return 1;
        if (p2 == PokerType.JOKER) return -1;
        if (p1 == PokerType.BOOM) return 1;
        if (p2 == PokerType.BOOM) return -1;
        if (p1 != p2) return 0; // not comparable
        return poker1.getValue() > poker2.getValue() ? 1 : -1;// type is the same
    }

    private static Poker parse(String rawCards) {
        String[] cardArr = rawCards.split("\\s+");
        switch (cardArr.length) {
            case 1: return new Poker(getPokerValue(cardArr[0]), PokerType.SINGLE);
            case 2:
                if (cardArr[0].equals(cardArr[1])) {
                    return new Poker(getPokerValue(cardArr[0]), PokerType.PAIR);
                }
                else {
                    return new Poker(getPokerValue(cardArr[0]), PokerType.JOKER);
                }
            case 3: return new Poker(getPokerValue(cardArr[0]), PokerType.THREE);
            case 4: return new Poker(getPokerValue(cardArr[0]), PokerType.BOOM);
            case 5: return new Poker(getPokerValue(cardArr[0]), PokerType.STRAIGHT);
            default:
                // should not happen
                throw new IllegalArgumentException("input is not valid " + rawCards);
        }
    }

    private static int getPokerValue(String value) {
        char firstChar = value.charAt(0);
        if (value.length() > 1) {
            switch (firstChar) {
                case 'J': return 17; // Joker
                case 'j': return 16; // joker
                default: return 10; // 10
            }
        }

        switch (firstChar) {
            case 'J': return 11;
            case 'Q': return 12;
            case 'K': return 13;
            case 'A': return 14;
            case '2': return 15;
            default:
                return firstChar + (1 - '1');
        }
    }

    public enum PokerType {
        SINGLE, PAIR, THREE, BOOM, JOKER, STRAIGHT
    }
    public static class Poker {
        /**
         * SINGLE: value of the card
         * PAIR: value of one of the card
         * THREE: value of one of the card
         * BOOM: value of one of the card
         * JOKER: value of "joker"
         * STRAIGHT: value of the first card
         */
        private int value;
        private PokerType type;
        public Poker(int value, PokerType type) {
            this.value = value;
            this.type = type;
        }
        public int getValue() {
            return value;
        }
    }
}
全部评论

相关推荐

在春招的哈士奇很苦闷:这个社会求职终于颠成了我不认识的样子
点赞 评论 收藏
分享
2本硕,在这一个下午真的绷不住了,浪费了太多时间,现在的技术栈还停在C语言和stm32上,找嵌入式的实习面试被拷打,找杭州的一个也找不到,真的心里难受,linux没学过,研二了开始慌了。
一条淡水魚:嵌入式这行的面试我认为实际项目比较重要,技术栈简单的提一嘴就行,面试官在乎的关键点在于你用了这些技术做了哪些工作解决了什么问题,而不是停留在离散的那些个技术栈上,那除了教课没有意义,好比你提到的c语言和32,你用32做过哪些具体的项目?接触过什么外设?使用过哪些公司的SDK?有没有实际产品落地?以及各种只有进入真正的生产环节当中才会积累到的经验......主动去和面试官讨论这些实际的问题,甚至还能就某个具体参数的合理性与他去简单探讨一下,只要技术栈对口,基本上就稳啦~(另外linux和RTOS是嵌入式的标配哦,选一个方向走下去吧)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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