40.扑克牌的顺子

http://zhedahht.blog.163.com/blog/static/25411174200951262930831/

http://blog.csdn.net/wuzhekai1985/article/details/6639919

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

分析:这题目很有意思,是一个典型的寓教于乐的题目。

我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把5张牌看成由5个数字组成的数组。大小王是特殊的数字,我们不妨把它们都当成0,这样和其他扑克牌代表的数字就不重复了。

接下来我们来分析怎样判断5个数字是不是连续的。最直观的是,我们把数组排序。但值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺。也就是排序之后的数组不是连续的,即相邻的两个数字相隔若干个数字,但如果我们有足够的0可以补满这两个数字的空缺,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5}。在1和3之间空缺了一个2,刚好我们有一个0,也就是我们可以它当成2去填补这个空缺。

于是我们需要做三件事情:把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。


/*
sort cards
get zeroCount and gapCount
*/
bool IsContinuous(int cards[],int length)
{
if(NULL == cards || length<=0)
return false;

sort(cards,cards+length);
int zeroCount = 0;
int gapCount = 0;
int i=0,j=0;
for (;i<length;++i)
{
if (cards[i]==0)
{
zeroCount++;
}
}

int prevCard = cards[i];
for (j=i+1;j<length;++j)
{
int curCard = cards[j];
if (curCard==prevCard)
{
return false;
}
else
{
gapCount +=(curCard-prevCard-1);
}
// update previous card
prevCard = curCard;
}
return gapCount<=zeroCount?true:false;
}

40.扑克牌的顺子

时间: 2024-10-08 20:49:45

40.扑克牌的顺子的相关文章

【剑指offer】:Q44:扑克牌的顺子

def IsContinuous(seq, num = 5): zeros = 0; d = 0 seq = sorted(seq) for i in range(num - 1): if seq[i] == 0: zeros += 1 continue if seq[i] == seq[i + 1]: return False d += seq[i + 1] - seq[i] - 1 return zeros >= d [剑指offer]:Q44:扑克牌的顺子,布布扣,bubuko.com

编程算法 - 扑克牌的顺子 代码(C)

扑克牌的顺子 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 从扑克牌中随机抽取5张牌, 推断是不是一个顺子, 即这5张牌是不是连续的. 2~10为数字本身, A为1, J为11, Q为12, K为13, 而大小王能够看成随意数字. 排序, 推断字符串之间的间隔数, 假设小于等于大小王的数量, 则是连续, 否则不是. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author: spike */

【编程题目】扑克牌的顺子

67.俩个闲玩娱乐(运算).1.扑克牌的顺子从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的.2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字. 思路: 用min.max记录输入的牌对应的数字大小,不考虑王,用wnum记录王的个数, record[13]记录每种牌是否出现过.设要判断n个牌是否连续 只要  出现不重复 且(max - min + 1) 在 [ n - wnum , n ]之间即可 /* 67.俩个闲玩娱

算法:扑克牌的顺子

扑克牌的顺子从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的. 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意数字. 没找到很好的解法,贴上我的解法,看有没有更好的解法. 我用一个数组存储输入的数字,用99代表大小王,然后对其排序,当期不为99时求出其前一个与后一个的差值-1之和,即中间差了多少张牌,与王的数量对比. #include <iostream>#include <stack>using name

剑指offer (44) 扑克牌的顺子

题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的 2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可以替换任意数字 题解分析: step1. 首先大小王看作0,与其他数字都区分开 step2. 对这5张牌排序 step3. 统计5张牌中0的个数和 相邻数字之间的空缺总数,因为 我们可以把0替换掉空缺所需的数 bool IsContinuous(std::vector<int>& num) { if (num.size() != 5) retur

剑指Offer对答如流系列 - 扑克牌的顺子

面试题61:扑克牌的顺子 题目描述 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的. 2-10为数字本身,A为1,J为11,Q为12,K为13,而大.小王可以看成任意数字. 问题分析 这道题算法思想还是比较简单的. 记大小王记为0,具体步骤如下: 进行对5张牌进行排序: 找出0的个数: 算出相邻数字的空缺总数: 如果0的个数大于等于空缺总数,说明连续,反之不连续: 记得判断相邻数字是否相等,如果有出现相等,说明不是顺子. 问题解答 public boolean isConti

【剑指offer】扑克牌的顺子

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27849055 题目描写叙述: LL今天心情特别好,由于他去买了一副扑克牌,发现里面竟然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想測測自己的手气,看看能不能抽到顺子,假设抽到的话,他决定去买体育彩票,嘿嘿!."红心A,黑桃3,小王,大王,方片5","Oh My God!"不是顺子.....LL不高兴了,他想了想,决定大\小

扑克牌的顺子

题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的.2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以为任意数字. 我们需要把扑克牌的背景抽象成计算机语言.不难想象,我们可以把5张牌看成由5个数字组成的数组.大小王是特殊的数字,我们不妨把他们都定义为0,这样就能和其他牌区分开来了. 接下来我们分析怎样判断5个数字是不是连续的,最直观的方法是把数组排序.值得注意的是,由于0可以当成任意数字,我们可以用0去补满数组中的空缺.如果排序之后的数组是不连续的,即相

经典算法——扑克牌的顺子

题目描写叙述 LL今天心情特别好,由于他去买了一副扑克牌,发现里面竟然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想測測自己的手气,看看能不能抽到顺子,假设抽到的话,他决定去买体育彩票,嘿嘿.!"红心A,黑桃3,小王,大王,方片5","Oh My God!"不是顺子.....LL不高兴了,他想了想,决定大\小 王能够看成不论什么数字,而且A看作1,J为11,Q为12,K为13. 上面的5张牌就能够变成"1,2,3,4,5&