• 算法题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 }
  • 相关阅读:
    深入理解iostat(转载)
    renameat2函数RENAME_EXCHANGE参数使用
    maven相关
    IDEA快捷键
    zookeeper
    SHA1字符串加密 积跬步
    C语言void关键字
    目录项、inode、数据块
    CAD带文字线型的文字偏移bug介绍
    20192419 202120222 《网络与系统攻防技术》实验五实验报告
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5167517.html
Copyright © 2020-2023  润新知