1. 程式人生 > >撲克牌順子

撲克牌順子

題目描述

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”(大小王分別看作2和4),“So Lucky!”。LL決定去買體育彩票啦。 現在,要求你使用這幅牌模擬上面的過程,然後告訴我們LL的運氣如何, 如果牌能組成順子就輸出true,否則就輸出false。為了方便起見,你可以認為大小王是0。 思路:大王小王相當於癩子,可以百搭,所以需要知道癩子的數量

  1. 想法一,根據癩子數量分類討論。程式碼如下
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.empty()) return false;
        sort(numbers.begin(),numbers.end());
        int i = 0;
        while(numbers[i]==0)//統計癩子數量
        {
            i++;
        }
        if(i==4) return true;//4個癩子,必定能組成順子
        else if(i==3)//3個癩子,剩下的兩張牌可以是相鄰,或者為順子的最大值和最小值,相差在1~4之間
        {
            if((numbers[4]-numbers[3])>=1&&(numbers[4]-numbers[3])<=4) return true;
            else return false;
        }
        else if(i==2)//2個癩子,剩下的3張牌中最大值和最小值之差在2~4之間,2個癩子可以填充在3張牌之外,也可以填充在3張牌之間,還有一點要注意的3張牌中不能有重複的
        {
            if((numbers[4]-numbers[2])>=2&&(numbers[4]-numbers[2])<=4&&(numbers[4]!=numbers[3])&&(numbers[3]!=numbers[2])) return true;
            else return false;
        }
        else if(i==1)//1個癩子,剩下的4張牌中最大值和最小值之差在3~4之間,不能有重複的牌
        {
            if((numbers[4]-numbers[1])>=3&&(numbers[4]-numbers[1])<=4&&(numbers[4]!=numbers[3])&&(numbers[3]!=numbers[2])&&(numbers[2]!=numbers[1])) return true;
            else return false;
        }
        else //0個癩子,max-min==4,且不能有重複的牌
        {
            if((numbers[4]-numbers[0])==4&&(numbers[4]!=numbers[3])&&(numbers[3]!=numbers[2])&&(numbers[2]!=numbers[1])&&(numbers[1]!=numbers[0])) return true;
            else return false;
        }
    }
};
  1. 想法二,通過上述程式碼,可以發現,沒有癩子的情況,5張牌能組成癩子的充分必要條件:max-min==4&&不能有重複值,考慮下有癩子的情況,對已有的max和min並沒有影響,對重複值也沒有影響,影響的是Max-min的值,0個癩子,值為4,1個癩子,值為3或4,2個癩子,值為2,3,4,,3個癩子,值為1,2,3,4, 4個癩子必定可以組成順子,所以癩子的數量不一定需要知道,上面的程式碼中,是經過排序的,經過上面的論述,發現其實不需要排序,只要記錄癩子的數量,max ,min這3個值,max-min的值不能大於等於5。根據這個思路,程式碼如下:
class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.empty()) return false;
        int max = 0;
        int min = 14;
        int temp = 15;//記錄上一個值,與下一個進行比對
        for(int i = 0;i<numbers.size()-1;i++)
        {
            if(temp==numbers[i]) return false;//重複
            if(numbers[i]==0)//是癩子的,則結束本次迴圈
            {
                continue;
            }
            if(numbers[i]>max) max = numbers[i];//記錄最大值
            if(numbers[i]<min) min = numbers[i];//記錄最小值
            temp = numbers[i];
            if(max-min>=5) return false;//如果過程中出現max-min>=5說明不可能組成順子
        }
       return true;
    }
};

經過上面的程式碼,發現癩子的數量不需要知道,只要滿足這二個條件即可

  1. 不能有重複值
  2. 在滿足條件一的情況下,最大值減去最小值不能超過5