剑指Offer(Java版):扑克牌的顺序

题目:从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。

我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把五张牌看成由五个数字组成的数组。大小王是特殊的数字,我们不妨把他们定义为0,这样就能和其他牌区分开来了。

接下来我们分析判断5个数字是不是连续的,最直观的方法是把数组排 序。值得注意的是,由于0可以当成任意的数字,我们可以用0去补满数组中的空缺。如果排序之后的数组不是连续的,即相邻的两个数字像个若干个数字,但只要 我们有足够的0可以补满这两个空缺的数字,这个数组实际上还是连续的。举个例子,数组排序之后为{0,1,3,4,5},在1和3之间空缺一个2,刚好我 们有一个0,也就是我们可以把它当成2去填补这个空缺。

于是我们需要做3件事:首先把数组排序,再统计数组中0的个数,最后统计排序之后数组中相邻的数字之间的空缺总数。如果空缺综述小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。

最后我们还需要注意一点:如果数组中的非0数字反复出现,则该数组不是连续的。换成扑克牌的描述方式就是如果一副牌里含有对子,则不可能是顺子。

基于这个思路,我们实现我们的代码:

 

package cglib;

import java.util.Arrays;

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;
        }
    }


输出:

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

转载于:https://my.oschina.net/u/2822116/blog/726960

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值