數據結構-劍指offer-撲克牌中的順子

題目:從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2~10爲數字本身,A爲1,J爲11,Q爲12,K爲13,而大小王可以看作任意數字。

思路:首先把數組排序,其次統計數組中0的個數;最後統計排序之後的數組中相鄰數字之間的空缺總數。如果空缺的總數小於或者等於0的個數,那麼這個數組就是連續的;反之則不連續。

代碼1:使用sort全排序,對數組進行排序,然後統計0的個數,計算相鄰數字之間的總空缺數,並比較0的個數和總空缺數。報錯:只通過了一部分的測試用例,以[0,3,2,6,4]爲例,應該輸出true,而我的代碼輸出爲false。出錯原因:如果有一個元素爲0的話,下一個不應該跟0求差值,所以兩個判斷語句之間的關係應該是if-else。

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size() == 0) return false
        sort(numbers.begin(),numbers.end());
        int count = 0;
        int zeroCount = 0;
        if(numbers[0] == 0)
            zeroCount++;
        for(int i=1;i<numbers.size();i++){
            if(numbers[i] == 0)
                zeroCount++;
            if(numbers[i] == numbers[i-1])
                return false;
            else
                count += numbers[i] - numbers[i-1] - 1;
        }
        if(count <= zeroCount)
            return true;
        else
            return false;
    }
};

改進後的代碼:

class Solution {
public:
    bool IsContinuous( vector<int> numbers ) {
        if(numbers.size() == 0) return false;
        sort(numbers.begin(),numbers.end());
        int count = 0;
        int zeroCount = 0;
        //統計數組中0的個數
        //for(int i=0;i<numbers.size() && numbers[i] == 0;i++){
            //zeroCount++;
        //}
        for(int i=0;i<numbers.size();i++){
            if(numbers[i] == 0)
                zeroCount++;
            else{
                if(i+1<5){
                    if(numbers[i] == numbers[i+1])
                        return false;
                    else
                        count += numbers[i+1] - numbers[i] -1;
                }
            }
        }
        if(count <= zeroCount)
            return true;
        else
            return false;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章