【北邮复试机试】打牌

时间限制: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中的具体情况查看数组中的真假,若找到对应的真,返回真,否则返回假。



猜你喜欢

转载自blog.csdn.net/m0_38103546/article/details/79685485
今日推荐