题目:从扑克牌中随机抽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数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。

基于这个思路,我们可以写出如下的代码:

// Determine whether numbers in an array are continuous
// Parameters: numbers: an array, each number in the array is between
//             0 and maxNumber. 0 can be treeted as any number between
//             1 and maxNumber
//             maxNumber: the maximum number in the array numbers
bool IsContinuous(std::vector<int> numbers, int maxNumber)
{if(numbers.size() == 0 || maxNumber <=0)return false;// Sort the array numbers.std::sort(numbers.begin(), numbers.end());int numberOfZero = 0;int numberOfGap = 0;// how many 0s in the array?std::vector<int>::iterator smallerNumber = numbers.begin();while(smallerNumber != numbers.end() && *smallerNumber == 0){numberOfZero++;++smallerNumber;}// get the total gaps between all adjacent two numbersstd::vector<int>::iterator biggerNumber = smallerNumber + 1;while(biggerNumber < numbers.end()){// if any non-zero number appears more than once in the array,// the array can't be continuousif(*biggerNumber == *smallerNumber)return false;numberOfGap += *biggerNumber - *smallerNumber - 1;smallerNumber = biggerNumber;++biggerNumber;}return (numberOfGap > numberOfZero) ? false : true;
}

本文为了让代码显得比较简洁,上述代码用C++的标准模板库中的vector来表达数组,同时用函数sort排序。当然我们可以自己写排序算法。为了有更好的通用性,上述代码没有限定数组的长度和允许出现的最大数字。要解答原题,我们只需要确保传入的数组的长度是5,并且maxNumber为13即可。

本文已经收录到《剑指Offer——名企面试官精讲典型编程题》一书中,有改动,书中的分析讲解更加详细。欢迎关注。

本题已被九度Online Judge系统收录,欢迎读者移步到http://ac.jobdu.com/hhtproblems.php在线测试自己的代码。

博主何海涛对本博客文章享有版权。网络转载请注明出处http://zhedahht.blog.163.com/。整理出版物请和作者联系。

程序员面试题精选100题(40)-扑克牌的顺子[算法]相关推荐

  1. 程序员面试题精选100题(51)-顺时针打印矩阵[算法]

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如:如果输入如下矩阵: 1              2              3              4 5     ...

  2. 程序员面试题精选100题(37)-寻找丑数[算法]

    题目:我们把只包含因子 2. 3和 5的数称作丑数(Ugly Number).例如 6. 8都是丑数,但 14不是,因为它包含因子 7.习惯上我们把 1当做是第一个丑数.求按从小到大的顺序的第 150 ...

  3. 程序员面试题精选100题(28)-字符串的排列[算法]

    题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串 abc ,则输出由字符 a . b . c 所能排列出来的所有字符串 abc . acb . bac . bca . cab 和 ...

  4. 程序员面试题精选100题(59)-字符串的组合[算法]

    题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 分析:在本系列博客的第28题<字符串的排列>中,我们详细讨论 ...

  5. 程序员面试题精选100题(58)-八皇后问题[算法]

    题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法 ...

  6. 程序员面试题精选100题

    程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树   ...

  7. [程序员面试题精选100题]13.第一个只出现一次的字符

    [题目] 在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. [分析] [代码] /********************************* * 日期:2013- ...

  8. 程序员面试题精选100题(51)-顺时针打印矩阵

    // 程序员面试题精选100题(51)-顺时针打印矩阵.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <iostre ...

  9. 程序员面试题精选100题:求从1到n的正数中1出现的次数

    // 程序员面试题精选100题(25):求从1到n的正数中1出现的次数 // 如 f(253) = (2!=0) * 100 + 2 * f(99) + (5!=0) * 10 + 5 * f(9) ...

最新文章

  1. 微软成功抵御峰值高达 2.4Tbps 的 DDoS 攻击
  2. 总监路上的第 1 年,犯了两个小错误 | 程序员有话说
  3. 如何判断照片是否ps
  4. 汇编 cmp_ARM汇编语言入门(二)
  5. 如何为自己的项目在pycharm中设置debug?
  6. 仿ISQL功能的实现,可以实现批处理功能
  7. JS滚动条位置,顶部,底部,触发事件
  8. 采购模板html5,蓝色的采购信息管理系统手机界面wap模板
  9. 丁力 | cnSchema:中⽂知识图谱的普通话
  10. SONICWALL E-Class NSA 系列简介
  11. 源码完全注释:socket select
  12. SSA优化章:SSA优化PID
  13. 车规电阻AEC-Q200测试项目及元器件检测设备
  14. FreeRTOS任务切换过程深层解析
  15. 固态硬盘跟机械硬盘的区别
  16. halcon学习实战系列—如何更便捷,更高效的计算同心度
  17. perf: interrupt took too long
  18. 小米社招java面经_小米Java实习一面面经(凉)
  19. BugKu:WEB——gam1
  20. PTA-基础编程题目集-7-1 厘米换算英尺英寸

热门文章

  1. 梯度下降和随机梯度下降为什么能下降?
  2. 基因组与数据整合:DNA应用开发正在临近
  3. MySQL-CentOS7通过YUM安装MySQL5.7.29
  4. Spring-Spring 开发环境搭建及HelloSpring
  5. CSS基础_Day02
  6. 说说你对binlog、redo log和undo log的理解
  7. python 寻找旋转排序数组中的最小值
  8. 快速复制快捷键_复制粘贴额效率之王Ctrl+D都不掌握,那就真的Out了
  9. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统
  10. 2021-04-28 Python可视化图表生成-Matplotlib绘图