华为校园招聘2016上机笔试题3

扑克牌游戏大家应该都比较熟悉了,一副牌由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)输入的顺子已经经过从小到大排序,因此不用再排序了.

输入描述:

输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如4 4 4 4-joker JOKER。

输出描述:

输出两手牌中较大的那手,不含连接符,扑克牌顺序不变,仍以空格隔开;如果不存在比较关系则输出ERROR。
示例1

输入

4 4 4 4-joker JOKER

输出

joker JOKER
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            String[] towHands = line.trim().split("-");
            Poker left = create(towHands[0].trim().split(" "));
            Poker right = create(towHands[1].trim().split(" "));
            int result = left.compareTo(right);
            if (result > 0) {
                System.out.println(left.toString());
            } else if (result < 0) {
                System.out.println(right.toString());
            } else {
                System.out.println("ERROR");
            }
        }
    }


    private static Poker create(String[] items) {
        if (items.length == 1) {
            return new Single(items[0]);
        }

        if (items.length == 2) {
            if (items[0].equals("joker") || items[0].equals("JOKER")) {
                return new BigBoom(items);
            } else {
                return new Pair(items[0]);
            }
        }
        if (items.length == 3) {
            return new Three(items[0]);
        }
        if (items.length == 4) {
            return new Boom(items[0]);
        }

        if (items.length == 5) {
            return new Flow(items);
        }

        return null;
    }


    private enum Type {
        SINGLE,
        PAIR,
        FLOW,
        THREE,
        BOOM,
        BIGBOOM
    }


    private interface Poker {
        Type getType();

        int compareTo(Poker poker);
    }

    private static class Single implements Poker {
        private int value;
        private String name;

        public Single(String flag) {
            name = flag;
            value = Util.jugeValue(flag);
        }

        @Override
        public String toString() {
            return name;
        }

        public int compareTo(Poker poker) {
            if (poker.getType() == Type.BOOM ||
                    poker.getType() == Type.BIGBOOM) {
                return -1;
            }

            if (poker.getType() == Type.SINGLE) {
                Single other = (Single) poker;
                return value - other.value;
            }

            return 0;
        }

        public Type getType() {
            return Type.SINGLE;
        }
    }

    private static class Pair implements Poker {
        private int value;
        private String name;

        public Pair(String flag) {
            name = flag;
            value = Util.jugeValue(flag);
        }

        @Override
        public String toString() {
            return String.format("%s %s", name, name);
        }

        public int compareTo(Poker poker) {
            if (poker.getType() == Type.BOOM ||
                    poker.getType() == Type.BIGBOOM) {
                return -1;
            }

            if (poker.getType() == Type.PAIR) {
                Pair other = (Pair) poker;
                return value - other.value;
            }

            return 0;
        }

        public Type getType() {
            return Type.PAIR;
        }
    }

    private static class Three implements Poker {
        private int value;
        private String name;

        public Three(String flag) {
            name = flag;
            value = Util.jugeValue(flag);
        }

        @Override
        public String toString() {
            return String.format("%s %s %s", name, name, name);
        }

        public int compareTo(Poker poker) {
            if (poker.getType() == Type.BOOM ||
                    poker.getType() == Type.BIGBOOM) {
                return -1;
            }

            if (poker.getType() == Type.THREE) {
                Three other = (Three) poker;
                return value - other.value;
            }

            return 0;
        }

        public Type getType() {
            return Type.THREE;
        }
    }

    private static class Flow implements Poker {
        private int value;
        private String[] names;

        public Flow(String[] names) {
            this.names = names;
            value = Integer.parseInt(names[0]);
        }

        public int compareTo(Poker poker) {
            if (poker.getType() == Type.BOOM ||
                    poker.getType() == Type.BIGBOOM) {
                return -1;
            }

            if (poker.getType() == Type.FLOW) {
                Flow other = (Flow) poker;
                return value - other.value;
            }

            return 0;
        }

        @Override
        public String toString() {
            return String.join(" ", names);
        }

        public Type getType() {
            return Type.FLOW;
        }
    }

    private static class Util {
        public static int jugeValue(String flag) {
            if (flag.equals("JOKER")) {
                return 17;
            } else if (flag.equals("joker")) {
                return 16;
            } else if (flag.equals("2")) {
                return 15;
            } else if (flag.equals("A")) {
                return 14;
            } else if (flag.equals("K")) {
                return 13;
            } else if (flag.equals("Q")) {
                return 12;
            } else if (flag.equals("J")) {
                return 11;
            } else {
                return Integer.parseInt(flag);
            }
        }
    }

    private static class Boom implements Poker {
        private int value;
        private String name;

        public Boom(String flag) {
            name = flag;
            value = Util.jugeValue(flag);
        }


        @Override
        public String toString() {
            return String.format("%s %s %s %s", name, name, name, name);
        }

        public int compareTo(Poker poker) {
            if (poker.getType() == Type.BIGBOOM) {
                return -1;
            }

            if (poker.getType() == Type.BOOM) {
                Boom other = (Boom) poker;
                return value - other.value;
            }

            return 1;
        }

        public Type getType() {
            return Type.BOOM;
        }
    }

    private static class BigBoom implements Poker {
        private String[] names;

        public BigBoom(String[] names) {
            this.names = names;
        }

        public int compareTo(Poker poker) {
            return 1;
        }

        public Type getType() {
            return Type.BIGBOOM;
        }


        @Override
        public String toString() {
            return String.format("%s %s", names[0], names[1]);
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/fly1024/p/12578206.html