本文參考自《劍指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)方法(快排原理)。