44 - 判断扑克牌是否是顺子

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


首先应该对该问题做数据抽象,5张普通牌可以用数字代替,大小王是特殊牌,我们可以用 0 代替。将大小王和普通牌分离。
检查是否是顺子:
首先应该进行排序,然后统计 0 的个数, 最后统计相邻数字之间的间隔个数。
如果 0 的次数 大于等于 间隔的次数,则是顺子,否则不是顺子。另外,如果出现非0外的相同的数,即对子,则不是顺子。

如:{0,1,3,4,5} 中 0 的个数为 1, 间隔个数为 1,则是顺子;
{0,1,3,4,6}中 0 的个数为 1, 间隔个数为 2,则不是顺子;


#include <iostream>
#include <algorithm>
using namespace std;
bool IsContinuous(int nums[], int length) {
    if (nums == NULL || length < 5)
        return false;
    sort(nums, nums+length); //注意排序范围是 [pBegin, pEnd), 不包括 pEnd
    int zero_counts = 0; // 0 的个数
    int gap_counts = 0; // 间隔的个数
    int i = 0;
    // 统计 0 的个数
    while (i < length && nums[i] == 0) {
        zero_counts++;
        i++;
    }
    // 统计间隔
    int prev = nums[i++];
    for (; i < length; i++) {
        if (nums[i] == prev) // 相等,不存在顺子
            return false;
        gap_counts += (nums[i] - prev - 1);
        prev = nums[i];
    }
    if (zero_counts >= gap_counts)
        return true;
    else
        return false;
}
int main() {
    const int len = 5;
    int nums1[] = {1,4,5,0,0};
    int nums2[] = {1,3,4,5,0};
    int nums3[] = {1,3,4,4,0};
    int nums4[] = {1,3,4,6,0};
    cout << IsContinuous(nums1, len) << endl;
    cout << IsContinuous(nums2, len) << endl;
    cout << IsContinuous(nums3, len) << endl;
    cout << IsContinuous(nums4, len) << endl;
}

输出结果:

1
1
0
0
[Finished in 0.7s]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值