剑指offer之扑克牌的顺子

提供一种与书上不太相同的思路:首先新建一个长度为5(顺子长度)的数组,对于除了大小王以外的数,按照从大到小的顺序依次放入数组中。但是不是一个一个挨着放,而是放到数组相应的位置。

举个例子,对于升序数组“0,0,4,6,7”,先将4放到数组下标为0的位置。

然后将6放到数组相应的位置:

然后将7放到数组相应的位置:

如果非0的数全部都放在数组中,那么这一序列就是顺子。如果在将牌放入数组的过程中,出现下标越界的情况,则说明不可能组成顺子。

我觉得这个方法可能要比书上的更容易理解一点。

附上代码:

import java.util.Arrays;
public class Solution {
    public boolean isContinuous(int [] numbers) {
        if(numbers.length==0){
            return false;
        }
        Arrays.sort(numbers);
        int[] continuousArray=new int[5];
        int index=0;
        int curNum=0;
        int startIndex=0;
        while(numbers[startIndex]==0){//大小王不用管,越过即可
            startIndex++;
        }
        curNum=numbers[startIndex];
        for(int i=startIndex+1;i<numbers.length;i++){
            if(numbers[i]!=0){
                int diff=numbers[i]-curNum;
                if(diff==0){//对子直接返回false
                    return false;
                }
                if(diff>=numbers.length-index){//下一张牌与上一张牌的差不能超过5-index
                    return false;
                }
                index+=diff;
                continuousArray[index]=numbers[i];
                curNum=numbers[i];
            }
        }
        return true;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值