您的位置:首页 > Web前端

剑指Offer学习总结-扑克牌的顺子

2018-01-25 20:41 405 查看

剑指Offer学习总结-扑克牌的顺子

本系列为剑指Offer学习总结,主要是代码案例的分析和实现:

书籍链接:http://product.dangdang.com/24242724.html

原作者博客:http://zhedahht.blog.163.com/blog/static/254111742011101624433132/

原作者博客链接有完整的项目代码下载。

扑克牌的顺子

题目

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

正确分析的解法

随机抽的5张牌可以看成5个数字组成的数组,大、小王是特殊的数字,不妨定义为0.

接下来只要判断5个数字是不是连续的。最直观的方法是排序,然后用0去补满数组中的空缺。

如果排序后的数组不是连续的,即相邻的两个数字都相隔若干个数字,

但只要我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。

除此之外,还要注意非0数字重复出现,则该数组不是连续的

bool IsContinuous(int* numbers, int length)
{
if(numbers == NULL || length < 1)
return false;

//根据规则排序
qsort(numbers, length, sizeof(int), compare);

int numberOfZero = 0;
int numberOfGap = 0;

// 统计数组中0的个数
for(int i = 0; i < length && numbers[i] == 0; ++i)
++ numberOfZero;

// 统计数组中的间隔数目
int small = numberOfZero;
int big = small + 1;
while(big < length)
{
// 两个数相等,有对子,不可能是顺子
if(numbers[small] == numbers[big])
return false;
//统计累计出最大的间隔是多少 差距为1 不算
numberOfGap += numbers[big] - numbers[small] - 1;
small = big;
++big;
}

return (numberOfGap > numberOfZero) ? false : true;
}

int compare(const void *arg1, const void *arg2)
{
return *(int*)arg1 - *(int*)arg2;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: