
如何计算翻牌前拿到特定起手牌的概率
2026年2月12日
德州扑克抽水影响玩家收益,这些选择策略要知道
2026年2月12日大家好,我是吴师兄。
今天接着来学习,《剑指Offer》系列里的一道,堪称经典的题目,仍然给出了,极为详细的题解,以及精美的配图,还有动画。
一、题目描述
从好多副扑克牌里头随机抽取5张牌,去判定是不是算作一个顺子,也就是这5张牌是不是连贯着的。
从2到10用数字本身表示,1用A表示,11用J表示,12用Q表示,13用K表示,大、小王视为0并能看作任意数字。
A 不能视为 14。
示例 1:
输入:
1,2,3,4,5
输出: True
示例 2:
输入:
0,0,1,2,5
输出: True
限制:
二、题目解析
五张牌能不能构成顺子呢,比如说有这样的特性:在这五张牌当中,除去大小王以外,所有的牌都是不重复的,因为很明显的是,一旦出现重复的牌,像那种一、二、二、三、四这样的牌型肯定不是顺子。
除此之外,有以下几种情况:
1、5 张牌里面没有大小王。
存在这样一种情况,最大的那张牌与最小的那张牌之间的差值是4,举例来说,像1、2、3、4、5这样一组,其中最小的牌是1,最大的牌是5,这两者之间的差刚好为4。
2、5 张牌里面有一个大小王,即出现过一个 0。
鉴于0能够被视作任意数字,所以这个0能够转变为任意的数字,插入到剩余的4张牌里的任意位置句号。
这个时候,能够留意到,除开0以外,最大的牌跟最小的牌之间的差值有可能是3(情形1、情形2),也有可能是4(情形3)。
3、5 张牌里面有两个大小王,即出现过两个 0。
起因是,0能够视作任意数字,所以,这两个0能够转变为任意的数字,插入到,剩下的3张牌里的,任意位置。
这时,能够留意到,除去0以外,最大牌跟最小牌的差值有可能是2(情形1、情形2),也有或许是3(情形3),还可能是4(情形4)。
鉴于此能够瞧出,在顺子这种情形下,除去0以外,五张牌之中最大的那张牌跟最小的那张牌二者的差值必定是小于5的。
综上所述,我们可以去遍历这 5 张牌,执行如下的操作:
为了助力你更优地认知整个进程,我特地制作了一组动画,点击开启能够进行查看:
三、参考代码,登录 AlgoMooc 官网,获取更多算法图解。
// https://www.algomooc.com
// 作者:程序员吴师兄
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
斜杠德信竞技,剑指,优惠,61,要知道,扑克牌之中,的顺子,链接,https,冒号,leetcode,中横线,cn,中横线,com,斜杠,问题,bu,中横线,ke,中横线,pai,中横线,zhong,中横线,de,中横线,shun,中横线,zi,lcof,斜点杠。
classSolution{
设置一个哈希表,把 nums 当中的每一个元素,都放置到哈希表 cards 里面。
// 在 cards 中,每一个元素值仅允许出现一次
Set cards = newHashSet;
// 默认最小值为不可能存在的扑克牌值 14
intmin = 14;
// 默认最大值为不可能存在的扑克牌值 0
intmax = 0;
// 遍历 nums
for( intnum : nums) {
// num 为 0 ,说明是大小王,跳过它
if(num == 0) continue;
除此以外,这表明 num 并非是数值0,是要去对 max 以及 min 进行更新的。
// 更新最大值 max
max = Math.max(max, num);
// 更新最小值 min
min = Math.min(min, num);
要是察觉到 cards 已然存有 num 了,那就表明 nums 里头有重复的扑克牌,肯定没办法构成顺子。
要是卡片当中包含着那个数字,那么返回假值,要是不包含,那情况就不一样了。
// 将这个扑克牌加入到哈希表 cards 中
cards.add(num);
// 遍历结束后,查看最大牌和最小牌的差值是否小于 5
// 如果是小于 5,则可构成顺子
// 反之,无法构成顺子
returnmax – min < 5;

