一、题目描述

一副牌由54张扑克组成,含2~A各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王)

3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

现提供两手牌,请比较它们的大小,输出较大的牌,如果不存在比较关系则输出“ERROR”。

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

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

数据范围:保证输入合法

1. 输入

输入两手牌,两手牌之间用 “ - ” 连接,每张牌中间用空格 “ ” 分隔,“ - ” 两边没有空格。

如4 4 4 4-joker JOKER。

2. 输出

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

3. 样例

笔者自己创建了若干样例仅供参考。

输入:
4 4 4 4-joker JOKER
输出:
joker JOKER

输入:
4 4 4 4-6 6 6 6
输出:
6 6 6 6

输入:
4 4 4 4-2 2 2
输出:
4 4 4 4

输入:
A-JOKER
输出:
JOKER

输入:
3 4 5 6 7-8 9 10 J Q
输出:
8 9 10 J Q

输入:
4 4 4 -2 2
输出:
ERROR

二、思路分析

这道题读起来很复杂,但实际上做起来非常简单。由于1)输入的合法是被保证的无需检查、2)输入的牌型是确定已知、3)即便是顺子也已经被排序过,因此该题的难度已经被和蔼的出题方砍了很多。

为了方便讨论,我们先统一下称呼。四个相同的牌组成的炸弹称为“4炸”;大小王两张牌称为“王炸”;其的单牌、对子、三个、五顺统称为“普通牌”(不是炸弹的牌)。

分析这道题的思路是从上往下捋,先把最高权威的王炸处理掉,再把次高权威的4炸处理掉,那剩下的就是普通牌只需要比较大小就行了。

1. 排除王炸

王炸具有最高权威,同时也最容易处理——只需读入两手牌,如果出现“ joker JOKER ”则立即输出“ joker JOKER ”即可。是不是非常简单呢?

            // 1. 排除掉王炸的情况String oriStr = sc.nextLine();                  // 读入原始字符串,找joker JOKERif ( oriStr.indexOf("joker JOKER") != -1 ){System.out.println("joker JOKER");continue;}

2. 排除长度不相等的情况

经过第1步的处理,已经可以保证没有王炸,那么剩下的最高权威就是4炸。4炸只要遇到普通牌就一定最大,这种情形下两手牌的长度必然不相等。与此同时联想到,两手牌长度不相等时,刚好也可以判断出牌型不对应、要输出ERROR的情况,因此我们这一步就对长度不等的情况下手。

两手牌长度不相等时,要么其中一手是4炸而另一手是普通牌,要么两者都是普通牌但牌型不符要ERROR,我们只需要检查是否有一手牌是4炸即可(再次强调,输入已经被保证是合法的,所以如果长度为4就一定是4炸)。如果存在一手牌长度为4就直接将其输出;如果不存在,那一定是牌型不符输出ERROR。

         // 2. 排除掉两手牌长度不等的情况:要么一手4炸一手普通牌,要么两手普通牌但是牌型不符要ERRORString[] card1 = oriStr.split("-")[0].split(" ");String[] card2 = oriStr.split("-")[1].split(" ");if ( card1.length != card2.length ){String[] pointer = card1.length==4 ? card1: null ;  // 检查有没有一手牌的长度为4pointer = card2.length==4 ? card2 : pointer ;if ( pointer==null )    // 长度不等,且没有4炸,必然ERRORSystem.out.println("ERROR");else                    // 有4炸则输出4炸System.out.println(String.join(" ",pointer));continue;}

3. 处理剩下两种情况

经过前两步的工作,1)存在王炸的情况、2)一手4炸一手普通牌的情况、3)两手普通牌但牌型不符的情况都已经被排除掉,只剩下最后两种情况:1)两手普通牌且牌型相符、2)两手4炸,这两种情况无论是哪一种,都只需要比较一下第一张牌的大小关系。

我们用一个字符串String order来从小到大地存放"345678910JQKA2jokerJOKER",这样的话每一张牌在order中的下标大小关系也就是牌面大小关系。接着找出两手牌各自第一张牌的下标,大的那个就是要输出的牌。

         // 3. 只剩下两手普通牌和两手4炸的情况,只需要比较第一张牌String order = "345678910JQKA2jokerJOKER";if ( order.indexOf(card1[0]) < order.indexOf(card2[0]) )System.out.println(String.join(" ",card2));elseSystem.out.println(String.join(" ",card1));

三、完整代码

笔者的完整源代码如下,可以直接提交通过该题。该代码仅供大家参考,如各位大神有更好的想法欢迎留言讨论,期待与您共同进步!

import java.util.*;public class Main {public static void main(String[] agrs){Scanner sc = new Scanner(System.in);while (sc.hasNext()){// 1. 排除掉王炸的情况String oriStr = sc.nextLine();                  // 读入原始字符串,找joker JOKERif ( oriStr.indexOf("joker JOKER") != -1 ){System.out.println("joker JOKER");continue;}// 2. 排除掉两手牌长度不等的情况:要么一手4炸一手普通牌,要么两手普通牌但是牌型不符要ERRORString[] card1 = oriStr.split("-")[0].split(" ");String[] card2 = oriStr.split("-")[1].split(" ");if ( card1.length != card2.length ){String[] pointer = card1.length==4 ? card1: null ;  // 检查有没有一手牌的长度为4pointer = card2.length==4 ? card2 : pointer ;if ( pointer==null )    // 长度不等,且没有4炸,必然ERRORSystem.out.println("ERROR");else                    // 有4炸则输出4炸System.out.println(String.join(" ",pointer));continue;}// 3. 只剩下两手普通牌和两手4炸的情况,只需要比较第一张牌String order = "345678910JQKA2jokerJOKER";if ( order.indexOf(card1[0]) < order.indexOf(card2[0]) )System.out.println(String.join(" ",card2));elseSystem.out.println(String.join(" ",card1));}}
}

【华为机试HJ88】扑克牌大小 JAVA全过程详解相关推荐

  1. 华为机试(扑克牌大小3.3)

    华为机试(扑克牌大小3.3) 题目 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写J ...

  2. 华为机试HJ88:扑克牌大小

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大 ...

  3. 华为OD机试 - 整理扑克牌(Java JS Python)

    题目描述 给定一组数字,表示扑克牌的牌面数字,忽略扑克牌的花色,请按如下规则对这一组扑克牌进行整理: 步骤1. 对扑克牌进行分组,形成组合牌,规则如下: 当牌面数字相同张数大于等于4时,组合牌为&qu ...

  4. 【力扣638】 大礼包问题 JAVA全过程详解,绝对易懂

    [前言]:本文讲解[力扣638 大礼包]的[动态规划]方法及其[记忆化搜索]的改进. 一.题目描述 在 LeetCode 商店中,有 n 件在售的物品.每件物品 i 都有对应的价格,也有一些大礼包以优 ...

  5. Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题

    接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题   HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...

  6. 华为机试真题 javascript和java 报文解压缩 100%通过

    前言 <华为机试真题>专栏为华为OD机试真题,源码包含多种语言. 如果找不到想要的考题 ,或者需要最新考题的答案,请进行留言机试题目,[注:留言考题请注明机试的时间] java版.java ...

  7. 【华为机试真题Java】从入门到入职-真题列表导读

    写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...

  8. 【华为机试】死记硬背没思路?一般人我劝你还是算了吧

    大家好,我是哪吒. 五月份之前,如果你参加华为OD机试,收到的应该是2022Q4或2023Q1,这两个都是A卷题. 5月10日之后,很多小伙伴收到的是B卷,那么恭喜你看到本文了,抓紧刷题吧.B卷新题库 ...

  9. 华为机试108题(C 语言解答)

    Nowcoder题库链接:华为机试 HJ1 字符串最后一个单词的长度(字符串) 输入:hello nowcoder输出:8说明: 最后一个单词为nowcoder,长度为8 示例代码: HJ1.c #i ...

最新文章

  1. Bootstrap响应式与自适应区别
  2. 项目中常用的sql整理和详细01
  3. mysql awr flush_Oracle ASH内存强制Flush日志解决一例
  4. 转载的孩子们注意节操哈!!!
  5. 2600: [Ioi2011]ricehubh
  6. 知道python测试答案_大数据分析的python基础知道章节测试答案
  7. 坦克大战-C语言-详注版
  8. 使用Android自带DownloadManager下载文件
  9. MingW环境下的windows编程
  10. python学习笔记4-切片
  11. 单点登录系统设计分析
  12. OpenCV-Python+Moviepy 结合进行视频特效处理
  13. Python 实现毫秒级淘宝抢购脚本
  14. 阿里云短信发送 错误 请检查模板内容与模板参数是否匹配
  15. 全球与中国电子柜锁市场深度研究分析报告
  16. 公司局域网如何组建 公司局域网搭建方法
  17. python空气质量指数计算_Python入门案例(八):空气质量指数(AQI)计算
  18. 内网渗透-window权限维持
  19. 扣丁软件测试基础知识,苹果无线充电线圈揭秘,iphone8无线充电线圈介绍
  20. 人工智能之深度优先,广度优先,贪婪最佳优先搜索,A*搜索以及爬山法与遗传算法

热门文章

  1. 职场上流行的最恶毒的三句话
  2. 香蕉派R2 Pro安装Qt5
  3. iPhone 6将于10月17日中国大陆发售 5288元起
  4. 100盏灯开关的问题
  5. linux日志时间和date时间不一致,centos7系统日志时间与系统时间相差8小时
  6. 学习大数据的第23天——Set集合的小练习以及Map相关的知识
  7. 华为android系统怎么关闭,华为手机怎么关闭情景智能?华为手机关闭情景智能教程...
  8. NAN值及isnan函数
  9. Android应用实现微信登录与分享
  10. 淘宝关闭“售后评价”功能 消费者依然有权通过追加评价