題目:從撲克牌中隨機抽取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指針)