题目描述
斗地主起源于湖北十堰房县,据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的,如今已风靡整个中国,并流行于互联网上。
牌型: 单顺,又称顺子,最少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张牌)
输入
输入的第一行为当前手中的牌
输入的第二行为已经出过的牌(包括对手出的和自己出的牌)
输出
最长的顺子
对手可能构成的最长的顺子(如果有相同长度的顺子,输出牌面最大的那一个),
如果无法构成顺子,则输出 NO-CHAIN。
样例输入
3-3-3-4-4-5-5-6-7-8-9-10-J-Q-K-A-A-A-A
4-5-6-7-8-8-8
样例输出
9-10-J-Q-K
思路:
题目要求我们求出对方的最长顺子长度,那么我们就要先得到对方的牌信息,以此来推测对方的最长顺子长度。题目的输入带有我们自己所有的牌,以及目前已经出去的牌,我们由总拍数就能够得到对方的牌数,以此来推测对方的最长顺子长度。
因为顺子不涉及2和大小王,因此,我们不需要考虑这两种牌对我们影响,只需要考虑剩下牌如何产生顺子,剩下的牌就是3---A这几种牌,总共12种,所以可以定义一个数组长度为12,每个元素代表一种牌的个数是否为0,为零就赋值为0,否则赋值为1代表有这个牌,因此,最后我们就是求一个长度为12的数组的最长连续的1元素的长度,用0(n)的时间复杂度就可以完成要求。
代码:
package Date3Point21;import java.util.*;public class MainD {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);String s1 = scanner.nextLine();String s2 = scanner.nextLine();s1=s1+"-"+s2;String[] split = s1.split("-");int[] nums=new int[12];Arrays.fill(nums,4);Map<String ,Integer> sToInt=new HashMap<>();sToInt.put("J",11);sToInt.put("Q",12);sToInt.put("K",13);sToInt.put("A",1);Map<Integer ,String> IntToS=new HashMap<>();IntToS.put(11,"J");IntToS.put(12,"Q");IntToS.put(13,"K");IntToS.put(1,"A");for(int i=0;i<split.length;i++){int num=0;if(sToInt.containsKey(split[i])){num=sToInt.get(split[i]);}else if(!Objects.equals(split[i], "2")){num= Integer.parseInt(split[i]);}else{continue;}if(num==1){nums[nums.length-1]--;}else{nums[num-3]--;}}String maxStr="";int maxLen=0;String str="";int len=0;for(int i=0;i<nums.length;i++){if(nums[i]==0 || i==nums.length-1){if(nums[i]!=0){len++;str+="A";}if(len>=5 && len>maxLen){maxLen=len;maxStr=str;}else if(len==maxLen && len!=0){if (maxStr.charAt(0)<str.charAt(0)) {maxStr=str;}}len=0;str="";}else{len++;String s="";if(i==nums.length-1){s="A";}else if(IntToS.containsKey(i+3)){s=IntToS.get(i+3);}else{s=String.valueOf(i+3);}if(str.length()==0){str+=s;}else{str+="-"+s;}}}if(maxLen==0 || maxStr.length()<5){System.out.println("NO-CHAIN");}else{System.out.println(maxStr);}}
}