php实现顺子
检查顺子的基本逻辑
顺子在扑克中指的是连续的五张牌,例如3、4、5、6、7。在PHP中可以通过以下方式验证一组数字是否为顺子:
function isStraight($nums) {
// 过滤掉0(假设0代表癞子或万能牌)
$filtered = array_filter($nums, function($num) {
return $num != 0;
});
// 检查是否有重复的非0牌
if (count($filtered) != count(array_unique($filtered))) {
return false;
}
// 计算最大值和最小值的差
$max = max($filtered);
$min = min($filtered);
// 差值应小于5(考虑癞子填充)
return ($max - $min) < 5;
}
处理带癞子的顺子
如果牌组中包含0(代表癞子),需要特殊处理。癞子可以替代任何牌来组成顺子:
function isStraightWithWildcard($nums) {
sort($nums);
$wildcards = 0;
for ($i = 0; $i < count($nums) - 1; $i++) {
if ($nums[$i] == 0) {
$wildcards++;
continue;
}
$gap = $nums[$i + 1] - $nums[$i] - 1;
if ($gap < 0) { // 有重复牌
return false;
}
$wildcards -= $gap;
}
return $wildcards >= 0;
}
测试用例验证
编写测试用例验证函数的正确性:
$testCases = [
[1, 2, 3, 4, 5], // true
[0, 0, 1, 2, 3], // true
[1, 2, 3, 4, 6], // false
[0, 1, 2, 4, 5], // true
[0, 0, 0, 0, 1], // false
];
foreach ($testCases as $case) {
echo implode(',', $case) . ': ' .
(isStraight($case) ? 'true' : 'false') . "\n";
}
性能优化考虑
对于大型数据集,可以考虑以下优化:
- 提前终止循环:当发现重复牌时立即返回false
- 减少排序操作:使用线性扫描替代完整排序
- 位运算检查:使用位掩码快速检测重复牌
function isStraightOptimized($nums) {
$min = 14; $max = 0;
$seen = 0;
foreach ($nums as $num) {
if ($num == 0) continue;
if ($seen & (1 << $num)) return false;
$seen |= (1 << $num);
$min = min($min, $num);
$max = max($max, $num);
}
return ($max - $min) < 5;
}






