判断7张牌中是否存在顺子牌型

* code_3_plus.js

/*
【题目】
从一副不含大小王的牌组中随机抽出7张牌,判断7张牌中是否存在顺子牌型,即是否存在5张连续的牌。
当存在顺子牌型时,返回最大的一组顺子,即点数之和相加最大的5张连续牌,不存在时则直接返回null。

每张扑克牌由3位数的字符串组成,【1位花色+2位点数】即百位表示花色,个位和十位共同表示点数
花色部分:1-4分别表示,黑桃、红桃、草花、方块
点数部分:A为1,2-10为数字本身,J为11,Q为12,K为13。A可以视为14。

例:
101 表示黑桃A
201 表示红桃A
112 表示黑桃Q

【需求】
需要用JavaScript完成函数getShunzi,使其实现以下示例效果

【示例】
示例 1:
输入: ['101','102','103','104','105', '106', '107']
输出: ['103','104','105','106','107']
 

示例 2:
输入: ['202','203','101','104','105','308','107']
输出: ['101','202','203','104','105']


示例 3:
输入: ['101','102','103','104','105', '201', '107']
输出: ['101','102','103','104','105'] 或 ['201','102','103','104','105'] 均可

示例 4:
输入: ['202','206','101','104','105', '201', '308']
输出: null
*/

module.exports = getShunzi;

function Poker(s) {
    const ZERO = "0".charCodeAt(0);
    this.suit = s.charCodeAt(0) - ZERO;
    this.number = 10 * (s.charCodeAt(1)-ZERO) + s.charCodeAt(2)-ZERO;
}

Poker.prototype.__toString = function() {
    var s = "" + this.suit;
    if (this.number < 10) {
        s += "0";
    } else if (this.number === 14) {
        s += "01";  // 01,14都是A
        return s;
    }
    s += this.number;
    return s;
}

Poker.groupBy = function(/* Poker[] */pokers) {
    var a = [null, [], [], [], []];
    pokers.forEach(function(p) {
       a[p.suit].push(p);
    });
    return a;
}

Poker.sortByNumber = function(pokers) {
    return pokers.sort(function(/* Poker */a, /* Poker */b) {
        if (0 === a.number - b.number) {
            return a.suit - b.suit;
        }
        return a.number - b.number;
    });
}

Poker.unique = function(pokers) {
    var m = [0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0];
    var a = [];
    pokers.forEach(function(p) {
        if (m[p.number] === 0) {
            a.push(p);
            m[p.number] += 1;
        }
    });
    return a;
}

/**
 * @param {string[]} pokers 
 * @return {string[]}  
 */
function getShunzi(pokers = []) {
    // 在此编写逻辑
    var a = pokers.map(function(s) {
        return new Poker(s);
    });
    // "A" 01,14
    var len = a.length;
    for (var i = 0; i <len; i++) {
        if (a[i].number === 1) {
            a.push(new Poker(a[i].suit +"14"))
        }
    }
    a = Poker.unique( Poker.sortByNumber(a) );
    // console.debug(a)

    var left, right;
    var d = 0;
    const N = 5;
    for (right = a.length-1, left = right - 1;
         0 < left && 0 < right && right+1-left < N; )
    {
        d = a[left+1].number - a[left].number;
        if (d !== 1) {
            right -= 1;
            left = right -1;
        } else {
            left -= 1;
        }
        // console.debug("left="+left + ", right=" + right + ", d="+d);
    }
    if (right+1 - left < N) {
        return null;
    }
    d = a[left+1].number - a[left].number;
    if (d !== 1) {
        return null;
    }
    return a.slice(left, right+1).map(function(poker) {
        return poker.__toString();
    });
}

* main.js

var getShunzi = require ("./code_3_plus");

// var pokers = ['101','102','103','104','105', '106', '107']
// var pokers = ['107','202','102','203','105','101','104','204','308'];
// var pokers = ['202','203','101','104','105','308','107'];
// var pokers = ['101','102','103','104','105', '201', '107'];
// var pokers = ['202','206','101','104','105', '201', '308'];
// var pokers = ['201','208','209','110','111','112','313','101']
var pokers = ['101','207','411','113','102','412','303'];
var a = getShunzi(pokers);
console.log(a);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fareast_mzh

打赏个金币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值