劍指Offer(Java版):撲克牌的順序

題目:從撲克牌中隨機抽出5張牌,判斷是否是一個順子,即這五張牌是否是連續的。2——10爲數字自己,A爲1,J爲11,Q爲12,K爲13,而大小王爲任意數字。java

咱們須要把撲克牌的背景抽象成計算機語言。不難想象,咱們能夠把五張牌當作由五個數字組成的數組。大小王是特殊的數字,咱們不妨把他們定義爲0,這樣就能和其餘牌區分開來了。數組

接下來咱們分析判斷5個數字是否是連續的,最直觀的方法是把數組排 序。值得注意的是,因爲0能夠當成任意的數字,咱們能夠用0去補滿數組中的空缺。若是排序以後的數組不是連續的,即相鄰的兩個數字像個若干個數字,但只要 咱們有足夠的0能夠補滿這兩個空缺的數字,這個數組實際上仍是連續的。舉個例子,數組排序以後爲{0,1,3,4,5},在1和3之間空缺一個2,恰好我 們有一個0,也就是咱們能夠把它當成2去填補這個空缺。排序

因而咱們須要作3件事:首先把數組排序,再統計數組中0的個數,最後統計排序以後數組中相鄰的數字之間的空缺總數。若是空缺綜述小於或者等於0的個數,那麼這個數組就是連續的;反之則不連續。class

最後咱們還須要注意一點:若是數組中的非0數字反覆出現,則該數組不是連續的。換成撲克牌的描述方式就是若是一副牌裏含有對子,則不多是順子。test

基於這個思路,咱們實現咱們的代碼:import

 

package cglib;方法

import java.util.Arrays;im

public class jiekou {統計

        public static void main(String[] args) {
        int[] array={0,4,6,8,0};
        jiekou test=new jiekou();
        System.out.println(test.isContinuous(array));
        }
        public boolean isContinuous(int[] number){
        if(number==null){
            return false;
        }
        Arrays.sort(number);//升序
        int numberZero=0;
        int numberGap=0;
        for(int i=0;i<number.length&&number[i]==0;i++){
        numberZero++;
        }
        int small=numberZero;
        int big=small+1;
        while(big<number.length){
        if(number[small]==number[big])
            return false;
        numberGap+=number[big]-number[small]-1;
        small=big;
        big++;
        }
        return (numberGap>numberZero)?false:true;
        }
    }sort


輸出:

true

 

或者:

package cglib;

import java.util.Arrays;

public class jiekou {

     public boolean isContinous(int[] arr){  
            if(arr == null || arr.length!= 5)  
                return false;  
            int countOf0 = (arr[0] == 0?1:0);  
            int dis=0;  
            for(int i = 1;i<arr.length;i++){  
                if(arr[i] == 0)  
                    countOf0++;  
                int t = arr[i];  
                int j = 0;  
                for(j = i-1;j>=0;j--){  
                    if(t!=0 && t==arr[j])  
                        return false;  
                    else  
                        if(t>arr[j])  
                            break;  
                        else  
                            arr[j+1] = arr[j];  
                }  
                arr[j+1] = t;  
            }  
            for(int i = 0;i<arr.length-1;i++){  
                if(arr[i] != 0)  
                    dis+= arr[i+1]-arr[i]-1;  
            }  
            if(dis <= countOf0)  
                return true;  
            else   
                return false;  
        }  
        public static void main(String[] args){  
            int[] arr = {0,0,1,2,5};  
            jiekou test = new jiekou();  
            System.out.println(test.isContinous(arr));  
        }
    }


輸出:

true

相關文章
相關標籤/搜索