本文參考自《劍指offer》一書,代碼采用Java語言。
題目
從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。2~10為數字本身,A為1,J為11,Q為12,K為13,而大、小王可以看成任意數字。
思路
輸入為大小等於5的數組(大小王記為0),輸出為布爾值。具體步驟如下:
1)進行對5張牌進行排序;
2)找出0的個數;
3)算出相鄰數字的空缺總數;
4)如果0的個數大於等於空缺總數,說明連續,反之不連續;
5)記得判斷相鄰數字是否相等,如果有出現相等,說明不是順子。
測試算例
1.功能測試(沒有/有一個/多個大小王,有對子,連續/不連續)
2.特殊測試(null)
Java代碼
//題目:從撲克牌中隨機抽5張牌,判斷是不是一個順子,即這5張牌是不是連續的。
//2~10為數字本身,A為1,J為11,Q為12,K為13,而大、小王可以看成任意數字。
public class ContinousCards {
public boolean isContinuous(int [] numbers) {
if(numbers==null || numbers.length<=0)
return false;
Arrays.sort(numbers);
int numberOf0 = 0;
int numberOfGap = 0;
for(int i=0;i<numbers.length;i++){
if(numbers[i]==0)
numberOf0++;
}
int small = numberOf0;
int big = numberOf0+1;
while(big<numbers.length){
if(numbers[small]==numbers[big])
return false;
numberOfGap+=numbers[big++]-numbers[small++]-1;
}
if(numberOf0>=numberOfGap) //大於等於,而不是等於!
return true;
return false;
}
}
收獲
1.這道題中,自己最開始想的是把0插入到空缺當中,當其實只要計算出0的個數和空缺的個數進行比較即可,有時候稍微轉換一下思路就豁然開朗了。
2.對數組排序,采用Arrays.sort(numbers)方法(快排原理)。
