斗地主之顺子

题目描述:

在斗地主扑克牌游戏中, 扑克牌由小到大的顺序为:3,4,5,6,7,8,9,10,J,Q,K,A,2,

玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。

其中顺子的出牌规则为:由 至少 5 张由小到大连续递增 的扑克牌组成,且 不能包含 2 。

例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,10,J,Q,K,A}都是有效的顺子;

而{J,Q,K,A,2}、 {2,3,4,5,6}、{3,4,5,6}、{3,4,5,6,8}等都不是顺子。

给定一个包含13张牌的数组,如果有满足出牌规则的顺子,请输出顺子。

如果存在多个顺子,请每行输出一个顺子,且需要按顺子的 第一张牌的大小(必须从小到大) 依次输出。

如果没有满足出牌规则的顺子,请 输出 No。

输入描述:

13张任意顺序的扑克牌,每张扑克牌数字用空格隔开,每张扑克牌的数字都是合法的,并且不包括大小王:

1 2 9 J 2 3 4 K A 7 9 A 5 6 不需要考虑输入为异常字符的情况

输出描述: 组成的顺子,每张扑克牌数字用空格隔开:

1 3 4 5 6 7 示例1:

输入

1 2 9 J 2 3 4 K A 7 9 A 5 6 输出

1 3 4 5 6 7 说明

13张牌中,可以组成的顺子只有1组:3 4 5 6 7

示例2:

输入

1 2 9 J 10 3 4 K A 7 Q A 5 6 输出

1 2 3 2 3 4 5 6 7 9 10 J Q K A 说明

13张牌中,可以组成2组顺子,从小到大分别为:3 4 5 6 7 和 9 10 J Q K A

示例3:

输入

1 2 9 9 9 3 4 K A 10 Q A 5 6 输出

1 No 说明

13张牌中,无法组成顺子

注意:

特殊输入

1 3 3 4 4 5 5 6 6 7 7 8 8 9

对应输出

1 2 3 2 3 4 5 6 7 8 3 4 5 6 7 8 9


let str = '2 9 J 10 3 4 K A 7 Q A 5 6'
let shunziArr = ['3','4','5','6','7','8','9','10','J','Q','K','A','2']
function test(){
    let arr = str.split(' ')
    let result = []
    arr.sort(sortFn)
    // 顺子没有2
    arr = arr.filter(e=>e!=='2')
    while (arr.length>=5){
        shunzi(arr,result)
    }
    result.sort((a,b)=>{
        if(a[0]===b[0]){
            return a.length - b.length
        }else {
            return 0
        }
    })
    if(result.length<1){
        console.log(0);
    }else {
        console.log(result.length);
        for(let i of result){
            console.log(i.join(' '));
        }
    }
}
function shunzi(arr,result){
    // console.log(arr);
    //先去重
    let newArr = [...new Set(arr)]
    let res = []
    for(let i=0;i<newArr.length;i++){
        let right = 1
        let index = shunziArr.findIndex(e=>e===newArr[i])
        res.push(newArr[i])
        let flag = true
        while (right<newArr.length && flag){
            if(newArr[i+right]===newArr[i+right+1]){
                right++
                continue
            }
            if(newArr[i+right]===shunziArr[index+right]){
                res.push(newArr[i+right])
            }else {
                flag = false
            }
            right++
        }
        if(res.length>=5){
            result.push(res)
            break
        }
    }
    for(let i of res){
        let index = arr.findIndex(e=>e===i)
        arr.splice(index,1)
    }
}
function sortFn(a,b){
    let aIndex,bIndex
    for(let [idx,i] of shunziArr.entries()){
        if(a===i){
            aIndex = idx
        }
        if(b===i){
            bIndex = idx
        }
    }
    if(aIndex>bIndex){
        return 1
    }else if(aIndex===bIndex){
        return 0
    }else {
        return -1
    }
}
test()