题目描述

德州扑克的花型由N张扑克牌组成(N<8),可以组成的牌型按照价值从高到低来区分分别为:

  1. 皇家同花顺:最高为Ace(一点)的同花顺。
    如:A K Q J 10的同花顺
  2. 同花顺:同一花色,顺序的牌。
    如:K Q J 10 9的同花顺
  3. 四条:有四张同一点数的牌。
    如:4 4 4 4 9
  4. 葫芦:三张同一点数的牌,加一对其他点数的牌。
    如:3 3 3 10 10
  5. 同花:五张同一花色的牌。
    如:J 10 8 7 5的全是红桃的牌
  6. 顺子:五张顺连的牌。
    如:5 4 3 2 A的非同花牌(此牌型为最小的顺子)
  7. 三条:仅有三张同一点数的牌,其余两张点数不同。
    如:9 9 9 5 3
  8. 两对:两张相同点数的牌,加另外两张相同点数的牌。
    如:K K 5 5 2
  9. 一对:仅有两张相同点数的牌。
    如:10 10 9 4 2
  10. 高牌:不符合上面任何一种牌型的牌型,由单牌且不连续不同花的组成,以点数决定大小。
    如:A 10 9 5 3的非同花的牌

这十种牌型分别输出“HuangJiaTongHuaShun”、“TongHuaShun”、“SiTiao”、“HuLu”、“TongHua”、“ShunZi”、“SanTiao”、“LiangDui”、“YiDui”、“GaoPai”。

扑克牌有4种花色,分别为(S表示黑桃,H表示红心,C表示草花,D表示方片)

本题的输入为任意小于8的N张牌,得到的结果为这些牌中排序最靠前的类型。

代码如下

import java.util.*;public class Solution {// 用于表示牌的类型权重,最大的牌型权重为10,然后依次递减static class Level {String name;int weight;Level(String n, int w) {name = n;weight = w;}}private static final int M = 5;private static final Map<String, Integer> mp = new HashMap<>();static {for (int i = 2; i <= 10; i++) {mp.put(Integer.toString(i), i);}mp.put("J", 11);mp.put("Q", 12);mp.put("K", 13);mp.put("A", 1);}/*** 翻牌** @param inHand string字符串 一组以单空格间隔的手牌(例如:SA HK H9 D8 C5 S5 H4)* @return string字符串*/public String showDown(String inHand) {String[] s = inHand.split(" ");// 求出所有5张的组合牌List<int[]> com = combinations(s.length);// 用优先级队列选出最大的类型Queue<Level> pq = new PriorityQueue<>((o1, o2) -> o2.weight - o1.weight);int[] point = new int[M];for (int[] i : com) {Set<Character> color = new HashSet<>();for (int j = 0; j < M; j++) {color.add(s[i[j]].charAt(0));point[j] = mp.get(s[i[j]].substring(1));}Arrays.sort(point);if (color.size() == 1) {tongHua(point, pq);} else {feiTongHua(point, pq);}}return pq.size() != 0 ? pq.poll().name : "";}private void tongHua(int[] point, Queue<Level> pq) {if (isShunZi(point)) {if (point[M - 1] == 13 && point[0] == 1) {pq.offer(new Level("HuangJiaTongHuaShun", 10));} else {pq.offer(new Level("TongHuaShun", 9));}} else {pq.offer(new Level("TongHua", 6));}}private void feiTongHua(int[] point, Queue<Level> pq) {if (point[0] == point[3] || point[1] == point[4]) {pq.offer(new Level("SiTiao", 8));} else if ((point[0] == point[2] && point[3] == point[4])|| (point[0] == point[1] && point[2] == point[4])) {pq.offer(new Level("HuLu", 7));} else if (point[0] == point[2] || point[1] == point[3] || point[2] == point[4]) {pq.offer(new Level("SanTiao", 4));} else {Set<Integer> ps = new HashSet<>();for (int p : point) {ps.add(p);}if (ps.size() == 3) {pq.offer(new Level("LiangDui", 3));} else if (ps.size() == 4) {pq.offer(new Level("YiDui", 2));} else {if (isShunZi(point)) {pq.offer(new Level("ShunZi", 5));} else {pq.offer(new Level("GaoPai", 1));}}}}private boolean isShunZi(int[] point) {for (int i = M - 2; i >= 1; i--) {if (point[i] != point[i + 1] - 1) {return false;}}if (point[1] == 10 && point[0] == 1) {return true;}return point[0] + 1 == point[1];}private List<int[]> combinations(int n) {List<int[]> com = new ArrayList<>();int[] in = new int[n];for (int i = 0; i < n; i++) {in[i] = i;}int[] out = new int[M];dfs(com, in, out, 0, 0);return com;}private void dfs(List<int[]> com, int[] in, int[] out, int idx, int cur) {if (idx == out.length) {int[] t = new int[out.length];System.arraycopy(out, 0, t, 0, out.length);com.add(t);return;}for (int j = cur; j < in.length; j++) {out[idx] = in[j];dfs(com, in, out, idx + 1, j + 1);}}
}

测试:

class Test {public static void main(String[] args) {Solution solution = new Solution();System.out.println("1: " + solution.showDown("SA SK SQ SJ S10 H10 C9").equals("HuangJiaTongHuaShun"));System.out.println("2: " + solution.showDown("SK SQ SJ S10 H10 C9 S9").equals("TongHuaShun"));System.out.println("3: " + solution.showDown("S3 HK H3 S7 DK D3 C3").equals("SiTiao"));System.out.println("4: " + solution.showDown("H3 D6 S3 SJ S10 H10 C3").equals("HuLu"));System.out.println("5: " + solution.showDown("S9 H7 D8 H2 H8 H9 HK").equals("TongHua"));System.out.println("6: " + solution.showDown("S3 H7 D4 S5 S7 H6 C7").equals("ShunZi"));System.out.println("7: " + solution.showDown("S3 H7 D4 S5 S7 HA C2").equals("ShunZi"));System.out.println("8: " + solution.showDown("S3 H7 DA S5 S7 H10 C7").equals("SanTiao"));System.out.println("9: " + solution.showDown("S9 HK H9 D8 C5 S5 H4").equals("LiangDui"));System.out.println("10: " + solution.showDown("S9 HK H9 D8 C10 S5 H4").equals("YiDui"));System.out.println("11: " + solution.showDown("SQ HK H9 D8 C10 S5 H4").equals("GaoPai"));}
}

【去哪儿旅行笔试题】德州扑克相关推荐

  1. 心血来潮之朋友的一道华为笔试题——德州扑克

    一副牌中的五张扑克牌, 牌型1:同花顺:同一花色的顺子 牌型2:四条:四张相同数字+单张 牌型3:葫芦:三张相同的数字+一对 牌型4:同花:同一花色 牌型5:顺子:花色不一样的顺子 牌型6:三条:三张 ...

  2. 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小

    2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小. 我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方 ...

  3. 去哪儿网笔试题——取出第一个重复的字符

    1 package com.shb.java; 2 /** 3 * 取出第一个重复的字符 4 * @author shaobn 5 * @date 2016-9-28 6 * @package_nam ...

  4. java笔试题2015_去哪儿2015笔试题JAVA实现

    第一题代码: 分析:将字符数组中的每个字符串,找出其中最长的那个与字符数组中长度进行比较: a.当最长的字符串的长度大于等于字符数组的长度时,直接输出 b.当最长的字符串的长度小于字符数组的长度时,找 ...

  5. 2014年去哪儿网笔试题--一个10*10的矩阵(可以理解为棋盘),随时生成一组数据填入矩阵,任何一个位置的数字除4进行计算,按余数着色......

    一个10*10的矩阵(可以理解为棋盘),随时生成一组数据填入矩阵,任何一个位置的数字除4进行计算,按余数着色,余数为0着色为red,1为blue,2为green,3为black,可以理解为生成4中颜色 ...

  6. 潇洒郎: 去哪儿2021届/2020年开发岗笔试题分享

    去哪儿2021届/2020年开发岗笔试题分享 1. 2020年,直播已经成为去哪儿网酒店预售的新武器, 去哪儿网CEO刚哥想从公司的m名员工中挑选n名参与自己的直播,已知m小于100请问一共有多少种选 ...

  7. 2019《去哪儿》春季校招第一站(含笔试题)

    PS:点进来的小伙伴,我想先声明,标题中的去哪儿指的是517Na这家公司. 离职已经过去了4天,这几天算是过上了悠闲而轻松的日子.瞌睡也睡了(忘记了早餐存在的价值),篮球也打了(下午一个人在小区里打篮 ...

  8. C#在类型实例化时都干了什么:从一道笔试题说开去

    C#在类型实例化时都干了什么:从一道笔试题说开去 原文来自:http://www.cnblogs.com/instance/archive/2011/05/27/2059409.html 前一阵子我参 ...

  9. 名企笔试:网易游戏2017招聘笔试题(赶去公司)

    网易游戏2017招聘笔试题(赶去公司) 题意: 终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug.假设市区是一个无限大的区域,每条街道假设坐标 ...

最新文章

  1. Visual Studio Code打开终端控制台
  2. 云计算大会有感—MapReduce和UDF
  3. qq空间网页版电脑_常用QQ软件,电脑C盘快满了,占用太多空间,如何快速清理?...
  4. trie树java_【数据结构】Trie树的应用:查询IP地址的ISP(Java实现)
  5. 《你不知道的JavaScript》-- 精读(五)
  6. 微信支付api的服务器上,服务器微信支付接口笔记(与app端对接)
  7. 清华大学计算机系高考生源,清华大学在这个高考大省录取人数创新高,网友:仍然是同分不同命...
  8. (13)Zynq DDR控制器介绍
  9. Ext核心代码分析之Function.createDelegate
  10. paip.提升用户体验与安全性---注册流程总结
  11. python用cartopy包画地图_利用Cartopy绘制带有地图投影的图形
  12. android 自定义圆形进度条,Android自定义控件实现圆形进度条
  13. 4.5.2 Stress Testing
  14. 蚂蚁金服实习三面,offer已拿。我总结了所有面试题,其实也不过如此!!
  15. TI | TM4C123Gx单片机之---ADC笔记
  16. 贝叶斯推断应用:垃圾邮件过滤
  17. excel项目计划_使用Excel计划您的聚会座位
  18. 对角矩阵、对称矩阵、单位向量、正交矩阵
  19. oracle字符串之间,oracle中判断字符串之间包含关系
  20. konga--添加service和rouce详细步骤

热门文章

  1. bat taskkill
  2. PLY文件格式及其MATLAB读写操作
  3. 基于值函数逼近的强化学习方法
  4. 多维度雷达图怎么做_前方高能!多维数据分析的神器雷达图PPT制作教程来啦!...
  5. 用户名不能包含中文和特殊符号,只能输入英文加数字
  6. Eclipse 搭配 MTJ 或 EclipseMe 而无法 预处理 的解决办法
  7. 备战蓝桥杯【二分查找无bug版】
  8. 微信H5支付----报undened index openid
  9. 释放让iBooks占用的冗余空间
  10. 吹响集结的号角:O'Reilly和Intel人工智能大会北京站在召唤!