PHPIN.NET

 找回密码
 立即注册
查看: 5299|回复: 0

[技巧手记] 从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张...

[复制链接]

469

主题

31

回帖

5507

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5507
发表于 2018-5-22 17:14:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续

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

分析该题:

  大小王可以当做任意数字,故将其记为0

  用php数组进行处理,将传入的5个数,放到数组里

  获取数组中每个数出现的次数:

    0的个数为n,n不能大于2

    其他的不能出现超过1次,超过即不能为5位顺子(这里有歧义);

  去重去0后,判断剩余数的个数m及差值 df 关系,

  如果差值df <= 剩余个数m + 0次数n -1,则这5个数是顺子

代码示例:
  1. function isStraight($num1, $num2, $num3, $num4, $num5){
  2.     $startNumArr = [$num1, $num2, $num3, $num4, $num5];
  3.     $numCountStatic = array_count_values($startNumArr);
  4.     $zeroCount = 0;
  5.     foreach ($numCountStatic as $num => $count) {
  6.         if ($num === 0) {
  7.             if ($count > 2) {
  8.                 return false;
  9.             }
  10.             $zeroCount = $count;
  11.         } else if ($count>1) {
  12.             return false; //这里有个歧义,不考虑重复数字不影响顺子组成的话,去掉该判断
  13.         } else if ($num > 13){
  14.             return false;
  15.         }
  16.     }
  17.     $uniqNumArr = array_unique($startNumArr);
  18.     sort($uniqNumArr);
  19.     if ($uniqNumArr['0'] === 0) {
  20.         array_shift($uniqNumArr);
  21.     }
  22.     return(count($uniqNumArr)+$zeroCount-1 >= max($uniqNumArr)-min($uniqNumArr));
  23. }

  24. var_dump(isStraight(6,3,7,4,5));
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|PHPIN.NET ( 冀ICP备12000898号-14 )|网站地图

GMT+8, 2024-4-18 20:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表