【劍指offer-Java版】44撲克牌的順子

撲克牌中的順子:從一副撲克牌中抽取5張,判斷是不是一個順子。 2- 10 爲自身,A 爲1 JQK爲11 12 13,大小王爲任意數

先按從小到大對5張牌進行排序
首先判斷大小王個數K(只能爲0 1 2)
然後判斷不連續的間隔之和M,比較M和K的大小;如果在遍歷的過程中出現了對子,那麼就直接退出,不可能再形成順子


    public class _Q44<T> {

    public boolean IsContinuous(int nums[]){
        if(nums == null) return false;
        if(nums.length < 5) return false;

        // 採用hash表進行排序
        int hash[] = new int[14];
        for(int i=0; i<nums.length; i++){
            hash[nums[i]]++;
        }
        int index = 0;
        for(int i=0; i<hash.length; i++){
            while(hash[i] > 0){
                nums[index++] = i;
                hash[i]--;
            }
        }

        boolean result = false;
        int numberOfZero = 0;
        int numberOfGap = 0;
        // 查找大小王個數
        for(int i=0; i<nums.length; i++){
            if(nums[i] == 0) numberOfZero++;
            else break;
        }

        for(int i=numberOfZero; i<(nums.length - 1); i++){
            // 出現對子
            if(nums[i+1] == nums[i]) {
                numberOfGap = numberOfZero + 1;
                result = false;
                break;
            }else{
                numberOfGap += nums[i+1] - nums[i] - 1;
            }
        }

        // 判斷大小王是否可以填補空缺 
        if(numberOfZero >= numberOfGap) result = true;

        return result;
    }

    }

測試代碼:


    public class _Q44Test extends TestCase {

    _Q44<?> poker = new _Q44();

    public void test(){
        int pokers1[] = {0, 4, 5, 3, 1};
        int pokers2[] = {0, 0, 5, 3, 1};
        int pokers3[] = {0, 0, 11, 3, 1}; // 間隔較大
        int pokers4[] = {2, 3, 4, 3, 1}; // 含有對子
        int pokers5[] = null;

        System.out.println(poker.IsContinuous(pokers1));
        System.out.println(poker.IsContinuous(pokers2));
        System.out.println(poker.IsContinuous(pokers3));
        System.out.println(poker.IsContinuous(pokers4));
        System.out.println(poker.IsContinuous(pokers5));
    }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章