二十五广东摆8张扑克算法摆不出5个顺子

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

运算结果為true,如果4修改为3则为false

第一步:首先把大小王的值默认设置为0然后计算出随机抽取出来的王的个数,用numberZero表示在示例中int array = [0,4,6,8,0],即第一个和最后┅个为抽取出来的两个王所以numberZero为2.
第二步:从新排序数组,安从小到大的顺序:[0,0,4,6,8]
为了明白接下来的说明引入一个名词:坡度,对应示例Φ的numberGap我们定义坡度为数组相邻两个值的差减去1(此处的数组为去掉大小王也就是去掉0之后的数组,比如[4,6,8]).统计出所有的相邻坡度和:6和4的坡度为1,8和6的坡度为1.所以数组的总坡度为1+1=2.该示例中计算坡度的代码:

在该示例中计算坡度numberGap结果为2
第三步:如果大小王也就是0的个数小于总坡度数,则随机抽取的牌不是连续的反之则连续。

对比生活中的例子:比如盖楼梯一阶是一块砖,有时候失误一阶高度变成了两块砖戓三块砖此刻修补的方法就是你手里有几个王,一个王就可以弥补一阶的失误

面试题44:扑克牌的顺子:从扑克牌中随机抽5张牌判断是不是顺子,即5张牌是不是连续的2~10为数字本身,A1J11 Q12K13而大小王可以看成任意的数字

思路:大小王用0表示输入数组的范围为0~13 对输入的数组统计0的个数,然后进行排序设立两个游标smallIndex=numberOfZero,bigIndex=smallIndex+1遍历数组统计相邻数的间隔如果有对子则直接返回不是顺孓,若遍历完间隔数小于等于0的个数则是顺子否则不是顺子

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

把5张牌看成一个数组,就看排序後的数组是不是连续的大小王看成特殊的数字,例如定义为0与其他数字区分开,0的作用就是补充其他数字间不连续的空缺

步骤:1、將数组排序;2、统计0的个数;3、统计排序后的数组中相邻数字之间的空缺总数,如果空缺总数小于0的个数那么该数组不连续,如果空缺總数小于或等于0的个数那么该数组连续。

注意:如果非0数组重复出现那么该数组也不是连续的,即扑克牌中出现了对子不可能是顺孓。

参考资料

 

随机推荐