Skip to content

Latest commit

 

History

History
79 lines (68 loc) · 1.85 KB

判断扑克牌顺子.md

File metadata and controls

79 lines (68 loc) · 1.85 KB

判断扑克牌顺子

描述

从扑克牌中随机抽取5张牌, 判断是不是一个顺子, 即这5张牌是不是连续的2-10位数字本身,
A为1, J为11, Q为12, K为13, 而大小王可以看成任意数字

分析

1. 大小王可以看成任意数字, 所以将大小王记为0
2. 将5个数放入一个数组中
3. 数组去重去0, 判断剩余元素的个数+原先0的个数 > 最大差值

代码

<?php

/**
 * 判断顺子
 *
 * @param $num1
 * @param $num2
 * @param $num3
 * @param $num4
 * @param $num5
 * @return bool
 */
function isStraight($num1, $num2, $num3, $num4, $num5)
{
    $arr = [$num1, $num2, $num3, $num4, $num5];

    // 0的个数
    $zeroCount = 0;

    // 检查参数
    $countValues = array_count_values($arr);
    foreach ($countValues as $num => $count) {
        if ($num == 0) {
            // 0的个数不能超过2
            if ($count > 2) {
                return false;
            }

            $zeroCount = $count;
        }
        // 考虑重复数字会影响顺子(例如34456这样的数字会当成非顺子), 如果不考虑重复数字则删掉该判断
        /*
        elseif ($count > 1) {
            return false;
        }
        */
        // 最大值不能超过13
        elseif ($num > 13) {
            return false;
        }
    }

    // 数组去重
    $uniqueArr = array_unique($arr);
    // 数组排序
    sort($uniqueArr);
    // 如果第一个元素是0则删除第一个元素
    if ($uniqueArr[0] == 0) {
        array_shift($uniqueArr);
    }

    // 最大值-最小值 < 数组元素个数+0的个数
    return (max($uniqueArr) - min($uniqueArr)) < (count($uniqueArr) + $zeroCount);
}

// 测试
// bool(true)
var_dump(isStraight(6,6,9,0,0));

参考