【剑指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));
    }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值