时间限制:1秒
空间限制:65536K
热度指数:3503
算法知识视频讲解
题目描述
牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌。 规则:出牌牌型有5种 [1]一张 如4 则5...9可压过 [2]两张 如44 则55,66,77,...,99可压过 [3]三张 如444 规则如[2] [4]四张 如4444 规则如[2] [5]五张 牌型只有12345 23456 34567 45678 56789五个,后面的比前面的均大。
输入描述:
输入有多组数据。 每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表处的牌。
输出描述:
压过输出YES 否则NO。
示例1
输入
12233445566677 33
输出
YES
package test;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
public class playcard {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()) {
HashMap<Integer, Integer> map1=new HashMap<>();
HashMap<Integer, Integer> map2=new HashMap<>();
String input=scanner.next();
char[] in=input.toCharArray();
for (int i = 0; i < in.length; i++) {
if (map1.containsKey(in[i]-'0')) {
int val=map1.get(in[i]-'0');
map1.put(in[i]-'0', val+1);
}else {
map1.put(in[i]-'0', 1);
}
}//for input map1
String play=scanner.next();
char[] in1=play.toCharArray();
for (int i = 0; i < play.length(); i++) {
if (map2.containsKey(in1[i]-'0')) {
int val=map2.get(in1[i]-'0');
map2.put(in1[i]-'0', val+1);
}else {
map2.put(in1[i]-'0', 1);
}
}// for input map2
boolean flag=false;
if (map2.size()==1) {
Set<Integer> set=map2.keySet();
Set<Integer> set2=map1.keySet();
for (Integer value:set) {
for (Integer val : set2) {
if (val>value&&map1.get(val)>=map2.get(value)) {
flag=true;
break;
}
}
}
}else if (map2.size()==5) {
Set<Integer> set=map2.keySet();
String s="";
for (Integer value : set) {
s=s+value;
}
String str[]={"12345","23456","34567","45678","56789"};
for (int i = 0; i < str.length; i++) {
if (s.equals(str[i])) {
boolean[] f=isContain(map1);
for (int j = i+1; j < f.length; j++) {
if (f[j]==true) {
flag=true;
break;
}
}
}
}
}
if (flag) {
System.out.println("YES");
}else {
System.out.println("NO");
}
}//while
}
public static boolean[] isContain(HashMap<Integer, Integer> map){
boolean[] flag={true,true,true,true,true};
String str[]={"12345","23456","34567","45678","56789"};
for (int i = 0; i < str.length; i++) {
for (int j = 0; j < 5; j++) {
if (map.containsKey(str[i].charAt(j)-'0')&&map.get(str[i].charAt(j)-'0')>=1) {
continue;
}else {
flag[i]=false;
}
}
}
return flag;
}
}
打牌分为两种情况:
1、出重复的牌,例如:1,11,111,1111
2、出顺子,共5张,分别为12345,23456,34567,45678,56789
根据这两种情况进行讨论:
使用了两个map,map1用于记录手中的牌与个数,map2用于记录出的牌与个数。
map2只有两种情况,一种是map的size为1一种是map的size为5。
size的值为1时,在map1中找值大于map2中的值和张数大于等于map2中的张数的,有则返回真,否则返回假。
size的值为5时,先查看到底是哪种情况,同时统计map1中含有5中情况的真假,存放在布尔型数组中,然后根据map2中的具体情况查看数组中的真假,若找到对应的真,返回真,否则返回假。