【Java】 劍指offer(61) 撲克牌的順子

 

本文參考自《劍指offer》一書,代碼採用Java語言。html

更多:《劍指Offer》Java實現合集  java

題目

  從撲克牌中隨機抽5張牌,判斷是否是一個順子,即這5張牌是否是連續的。2~10爲數字自己,A爲1,J爲11,Q爲12,K爲13,而大、小王能夠當作任意數字。數組

思路

  輸入爲大小等於5的數組(大小王記爲0),輸出爲布爾值。具體步驟以下:post

  1)進行對5張牌進行排序;測試

  2)找出0的個數;url

  3)算出相鄰數字的空缺總數;htm

  4)若是0的個數大於等於空缺總數,說明連續,反之不連續;blog

  5)記得判斷相鄰數字是否相等,若是有出現相等,說明不是順子。排序

 

測試算例 get

  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)方法(快排原理)。

 

更多:《劍指Offer》Java實現合集 

相關文章
相關標籤/搜索