撲克牌的順子(35)

題目

【LL今天心情特別好,因爲他去買了一副撲克牌,發現裏面居然有2個大王,2個小王。他隨機從中抽出了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、分析
將這5張牌抽象成5個數字,相當於檢查這5個數字能否排成連續的順子。且 0 可以看成任何數字。所以需要做三件事情:

  • 首先將數組排好序
  • 再統計數組中 0 的個數
  • 最後統計排序之後的數組中相鄰數字之間空缺的數字,如果空缺的總數小於或者等於 0 ,則數組連續,否則數組不連續。
  • 由於從 0 ~ 13之間的每個數字可能會出現4次,如果數組中有除0之外的其他數字重複出現,則該數組就不可能是順子。
  • 由於該數組只有5個數字,當使用 sort 函數進行排序和其他的方法進行排序差別不大通常認爲不同級別的時間複雜度只有當n足夠大的時候纔有意義。

2、代碼

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        int len=numbers.size();
        if(len!=5)
            return false;
        // 對容器中的5個數字進行排序
        sort(numbers.begin(),numbers.end());
        // 統計數組中0元素的個數
        int left=0;
        while(numbers[left]==0)
        {
            left++;
        }
        //遍歷容器中的五個元素,並進行判斷
        for(int i=left+1;i<len;++i)
        {
            //如果有重複的非0數字,則不能構成順子
            if(numbers[i]==numbers[i-1])
                return false;
            else
            {
                //看0能否填補兩個元素之間的值
                left-=(numbers[i]-numbers[i-1]-1);
            }
        }
        if(left>=0)
            return true;
        else
            return false;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章