php实现顺子
判断顺子的实现方法
在PHP中判断一组数字是否为顺子(连续序列),可以通过以下方法实现。假设输入是一个包含5个数字的数组(如扑克牌中的顺子判断场景):
方法一:排序后检查连续性
将数组排序后检查相邻数字的差值是否为1,允许处理包含重复或特殊值(如0代表癞子)的情况。
function isStraight($nums) {
sort($nums);
$zeroCount = 0; // 统计0(癞子)的数量
$gap = 0;
for ($i = 0; $i < count($nums) - 1; $i++) {
if ($nums[$i] == 0) {
$zeroCount++;
continue;
}
if ($nums[$i] == $nums[$i+1]) {
return false; // 有非0重复牌,不可能是顺子
}
$gap += $nums[$i+1] - $nums[$i] - 1; // 计算相邻牌间的空缺
}
return $gap <= $zeroCount; // 空缺能被癞子填补
}
方法二:极差判断法
通过计算非零数字的最大最小值差来判断,需排除重复数字。
function isStraight($nums) {
$min = 14; $max = 0;
$set = [];
foreach ($nums as $num) {
if ($num == 0) continue;
if (in_array($num, $set)) return false;
$min = min($min, $num);
$max = max($max, $num);
$set[] = $num;
}
return $max - $min < 5; // 极差小于5才可能组成顺子
}
使用示例
$hand1 = [1, 2, 3, 4, 5]; // 真顺子
$hand2 = [0, 0, 3, 4, 5]; // 双癞子可补1-2
$hand3 = [1, 2, 2, 4, 5]; // 重复牌
var_dump(isStraight($hand1)); // true
var_dump(isStraight($hand2)); // true
var_dump(isStraight($hand3)); // false
注意事项
- 扑克牌场景中,A-2-3-4-5是特殊顺子(最小顺子),需要单独处理
- 算法时间复杂度均为O(n),方法二空间复杂度略高因需存储集合
- 实际应用中可根据输入特点选择实现方式






