【剑指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));
    }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章