请教一个关于扑克牌顺子的算法问题

2018-09-12 10:52:55 +08:00
 orqzsf1

算法的问题:从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是连续的,JQK 用 11、12、13 表示。(不考虑大小王和花色

我的思路是:

  1. 判断是否重复,重复则一定不是顺子
  2. (最大的数字)-(最小的数字)!= 4 则不是
  3. 是顺子

这里有一个问题。。没有考虑特殊情况 10JQKA。

请教一下,应该如何判断这个特殊的边界问题比较好?

4808 次点击
所在节点    算法
24 条回复
teslayun
2018-09-12 16:50:10 +08:00
最近刚好在弄个斗地主,我这判断是顺子的方法是,先把选择的牌(数组)从大到小排序(且数组大于 5 ),然后在 for 循环,判断数组第 i 张减去第 i+1 张是否等于 1。
0x11901
2018-09-12 18:16:09 +08:00
……大哥,高中数学了解一下……
既然你已经有了第一步——判断是否重复,重复则一定不是顺子
那么 A 用 14,2 用 15 表示。是否是顺子,其实可以看作是否是公差为 1 的等差数列,如果是那么必然满足等差数列通项公式:$$ \ a_n=a_1+(n-1)d $$
所以你只需要找到首项、尾项和 n 就行了,公差 d 为 1 ……
代码用 cpp 吧你将就看一下吧:
```cpp
bool isContinuous(const std::vector<size_t> &vector)
{
return *max_element(vector.begin(), vector.end()) - *min_element(vector.begin(), vector.end())
== (vector.size() - 1) * 1;
}

bool isContinuous(size_t a_1, size_t a_n, ssize_t n)
{
return a_n - a_1 == (n - 1) * 1;
}

```
sampeng
2018-09-12 19:49:28 +08:00
如果是业务用。。我就直接怼枚举。一起就 10 个。。枚举最快最简单。
简单才是最好的。。
kootain
2018-09-12 19:49:51 +08:00
长度 5 的循环队列,第一张牌插入的时候从 0 开始,之后就是和 0 位置的差值,决定插入位置。如果队列有重复插入不成顺,反之成顺。
上面说排序的先考虑一下排序的复杂度,然后拍完序又要遍历一遍,不是最优解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488446

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX