编程题:最长的顺子(Java)

题目描述

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

牌型: 单顺,又称顺子,最少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);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值