撲克牌的順子

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

方法:首先把數組排序,再統計數組中0的個數,最後統計排序之後的數組中相鄰數字之間的空缺總數。如果空缺的總數小於或者等於0的個數,則這個數組就是連續的,反之不連續。如果數組中的非0數字重複出現,也是不連續的。

bool IsContinuous(int* numbers, int length){
    if (numbers == NULL || length < 1){
        return false;
    }

    qsort(numbers, length, sizeof(int), compare);

    int numberOfZero = 0;
    int numberOfGap = 0;

    // 統計數組中0的個數
    for (int i = 0; i < length && numbers[i] == 0; ++i){
        ++numberOfZero;
    }

    //統計數組中的間隔數目
    int small = numberOfZero;
    int big = small + 1;
    while (big < length){
        //兩個數字相等,有對子,不可能是順子
        if (numbers[small] == numbers[big]){
            return false;
        }

        numberOfGap += numbers[big] - numbers[small] - 1;
        small = big;
        ++big;
    }

    return (numberOfGap > numberOfZero) ? false : true;
}

int compare(const void* arg1, const void* arg2){
    return *(int*)arg1 - *(int*)arg2;
}

改進:使用長度爲14的哈希表,可以在O(n)時間排序。

測試用例

  • 功能測試(抽出的牌中有一個或者多個大、小王,抽出的牌中沒有大、小王,抽出的牌中有對子)
  • 特殊輸入測試(輸入NULL指針)
發佈了104 篇原創文章 · 獲贊 14 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章