判断7张扑克牌是否含有同花顺(5张同花顺子)

题目:判断扑克牌是否为同花顺

描述

什么是同花顺

5张牌,牌面数字连续,则是顺子,花色相同为同花,花色相同且数字连续,则是同花顺
扑克牌四种花色♠,♥,♣,◆,每个花色从A到K共13张牌,一共4*13=52张

要求

用0-51表示这52张牌,按照顺序,♠A-♠K为0-12,♥A-♥K为13-25,♣A-♣K为26-38,◆A-◆K为39-51
一副牌,发出7张牌,存于数组arr中,实现一个函数返回true或false判断是否有同花顺

解析:
判断数组是否为顺子,则要进行去重,排序,
首先去重排序后的数组要满足长度>=5
其次判断是否顺子:
    数组中只要有一个数字num+4 等于其在此数组中的下标i+4,即arr[i] + 4 = arr[i+4]
然后判断是否同花:
    0<=arr[i]<=12  spade
    13<=arr[i]<=25  heart
    26<=arr[i]<=38  club
    39<=arr[i]<=51  diamand
代码
function judge(arr) {
    let result = Array.from(new Set(arr)).sort((a, b) => a - b);
    if (result.length < 5) return false
    for (let i = 0; i < result.length; i++) {
        if (result[i] + 4 === result[i + 4]) { //顺子
            if (result[i] <= 12 && result[i] > 0 && result[i + 4] <= 12 && result[i + 4] >= 0) {
                return true
            } else if (result[i] <= 25 && result[i] > 13 && result[i + 4] <= 25 && result[i + 4] >= 13) {
                return true
            } else if (result[i] <= 38 && result[i] > 26 && result[i + 4] <= 38 && result[i + 4] >= 26) {
                return true
            } else if (result[i] <= 51 && result[i] > 39 && result[i + 4] <= 51 && result[i + 4] >= 39) {
                return true
            }
        }
    }
    return false
}

let arr = [9, 5, 6, 7, 7, 8, 0, 11]
let arr1 = [0, 4, 6, 7, 8, 9, 9, 11]
let arr2 = [0,5,2,3,6,4,8]
console.log(judge(arr)); //true
console.log(judge(arr1)); //false
console.log(judge(arr2)); //true

其实这样看着上面的代码其实不够简洁,我们可以把他们相同的区间合并,代码如下

function judge(arr) {
    let result = Array.from(new Set(arr)).sort((a, b) => a - b);
    if (result.length < 5) return false
    for (let i = 0; i < result.length; i++) {
        if (result[i] + 4 === result[i + 4]) { //顺子
            if (result[i] <= 8 && result[i] > 0) {
                return true
            } else if (result[i] <= 21 && result[i] > 13) {
                return true
            } else if (result[i] <= 34 && result[i] > 26) {
                return true
            } else if (result[i] <= 47 && result[i] > 39) {
                return true
            }
        }
    }
    return false
}

这样看代码简洁了很多,但是还是有很多的if else语句,我们还可以用策略模式来替换if else语句

// 分别封装♠,♥,♣,◆
function spade(item) {
    return item >= 0 && item <= 8
}
function heart(item) {
    return item >= 13 && item <= 21
}
function club(item) {
    return item >= 26 && item <= 34
}
function diamand(item) {
    return item >= 39 && item <= 47
}

function judge(arr) {
    let result = Array.from(new Set(arr)).sort((a, b) => a - b);
    if (result.length < 5) return false
    for (let i = 0; i < result.length; i++) {
        if (result[i] + 4 === result[i + 4]) {
            // 或 || 只要有一个是true,则返回的值都为true
            return spade(result[i]) || heart(result[i]) || club(result[i]) || diamand(result[i])
        }
    }
    return false
}

没了,就这样

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值