华为机试:最长的顺子

该代码示例是用Java编写的,用于模拟斗地主游戏,找出手中剩余牌中可能形成的最长顺子。程序通过HashMap存储和处理牌的张数,转换J、Q、K、A的数值表示,并遍历所有可能的连续序列来找到最长的顺子。
摘要由CSDN通过智能技术生成

题目描述

斗地主起源于湖北十堰房县,据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上。

牌型:单顺,又称顺子,最少5张牌,最多12张牌(3…A)不能有2,也不能有大小王,不计花色。

例如: 3-4-5-6-7-8,7-8-9-10-J-Q,3-4-5-6-7-8-9-10-J-Q-K-A

可用的牌 3<4<5<6<7<8<9<10<J<Q<K<A<2<B(小王)<C(大王),每种牌除大小王外有四种花色

(共有13×4+2张牌)

输入:

手上有的牌

已经出过的牌(包括对手出的和自己出的牌)

思路:没用到算法,用Hashmap存放扑克牌:对应张数 即可。

【模拟】

public class 最长的顺子 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String[] has = sc.nextLine().split(" ");
		String[] lost = sc.nextLine().split(" ");
		cal(has, lost);
	}

	static void cal(String[] has, String[] lost) {
		Map<String, Integer> map = new HashMap<String, Integer>();
		for (String temp : has) {
			if (temp.equals("J")) {
				temp = "11";
			}
			if (temp.equals("Q")) {
				temp = "12";
			}
			if (temp.equals("K")) {
				temp = "13";
			}
			if (temp.equals("A")) {
				temp = "14";
			}
			if (map.containsKey(temp)) {
				map.put(temp, map.get(temp) + 1);
			} else {
				map.put(temp, 1);
			}
		}
		for (String temp : lost) {
			if (temp.equals("J")) {
				temp = "11";
			}
			if (temp.equals("Q")) {
				temp = "12";
			}
			if (temp.equals("K")) {
				temp = "13";
			}
			if (temp.equals("A")) {
				temp = "14";
			}
			if (map.containsKey(temp)) {
				map.put(temp, map.get(temp) + 1);
			} else {
				map.put(temp, 1);
			}
		}
		for (int i = 3; i <= 14; i++) {
			String s = String.valueOf(i);
			if (!map.containsKey(s)) {
				map.put(s, 4);
			} else {
				int know = map.get(s);
				map.put(s, 4 - know);
			}
		}
		for (Map.Entry<String, Integer> entry : map.entrySet()) {
			System.out.print(entry.getKey() + " ");
			System.out.println(entry.getValue());
		}
		int total = 0;
		int maxL = 0;
		StringBuffer sb = new StringBuffer();
		StringBuffer maxSb = null;
		for (int i = 3; i <= 14; i++) {
			String s = String.valueOf(i);
			if (map.get(s) > 0) {
				total++;
				if (s.equals("11")) {
					s = "J";
				}
				if (s.equals("12")) {
					s = "Q";
				}
				if (s.equals("13")) {
					s = "K";
				}
				if (s.equals("14")) {
					s = "A";
				}
				sb.append(s + " ");
			} else {
				if (total < 5) {
					total = 0;
				} else {
					if (maxL < total) {
						maxL = total;
						maxSb = new StringBuffer(sb);
					} else if (maxL == total) {
						maxSb = new StringBuffer(sb);
					}
				}
				sb.setLength(0);
			}
		}
		if (total < 5) {
			total = 0;
		} else {
			if (maxL < total) {
				maxL = total;
				maxSb = new StringBuffer(sb);
			} else if (maxL == total) {
				maxSb = new StringBuffer(sb);
			}
		}
		if (maxSb == null) {
			System.out.println("NO-CHAIN");
		} else {
			System.out.println(maxSb);
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值