• 算法题7 判断扑克牌中的顺子


    题目

      来源 http://www.cnblogs.com/python27/archive/2011/11/27/2264405.html

      随机抽取扑克牌中的n张牌,判断是不是顺子,即这5张牌是不是连续的。其中A看成1J看成11Q看成12K看成13,大小王可以看成任何需要的数字。

    分析

      对于扑克牌来说,数字范围是很明确的,1到K外加大小王(设定为M)。假如这副牌是个顺子,也就是每张牌都不相同,那么利用一个大小为14的辅助数组counts[]就可以快速的实现排序,记录每张牌出现的次数,然后遍历输出次数为1的值即可。

    判断这副牌是不是一个连续数列,需要判断相邻两个数字的差是否为1,大于1的话由M来填充(可以填充两个缺位)。

    因为这样一副牌最多不过54张,算法时间复杂度O(1),空间复杂度O(1)

    代码

     1 bool IsContinuousPoker(char* pokers,unsigned int n)
     2 {
     3     if (pokers==NULL||n==0)
     4         throw std::exception("Invalid input.");
     5 
     6     int *counts=new int[14]();
     7 
     8     char *p=pokers;
     9     unsigned int num=0;
    10     while (*p!='')
    11     {
    12         if (*p=='J')
    13             num=11;
    14         else if (*p=='Q')
    15             num=12;
    16         else if (*p=='K')
    17             num=13;
    18         else if(*p=='M')
    19              num=0;
    20         else
    21             num=*p-'0';
    22 
    23         counts[num]++;
    24         if(num!=0&&counts[num]>1)
    25             return false;
    26 
    27         p++;
    28     }
    29 
    30     int pre=0;
    31     for (int i=1;i<14;i++)
    32     {
    33         if (counts[i]==1)
    34         {
    35             int dif=i-pre-1;
    36             if (pre!=0&&dif>0)
    37             {
    38                 counts[0]-=dif;
    39                 if (counts[0]<0)
    40                     return false;                
    41             }
    42             pre=i;
    43         }
    44     }
    45     return true;
    46 }
  • 相关阅读:
    ios NSString format 保留小数点 float double
    IOS中延时执行的几种方式的比较和汇总
    ioss使用xcode常用快捷键
    iphone 6plus 下app里的状态栏和界面会被放大的问题//以及设置APP闪屏页/APP图标流程
    iostbleView刷新后显示指定cell
    iOS-打包成ipa的4种方法
    iosttableViewCell右侧的箭头,圆形等
    Linux学习之CentOS(二十)------vi/vim 按键说明
    gzip
    bzip2
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5167517.html
Copyright © 2020-2023  润新知