剑指Offer题目:从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意的 数字。

剑指Offer面试题 44:扑克牌的顺子
从扑克牌中随机抽 5 张牌,判断是不是顺子,即这 5 张牌是不是连续的。 2-10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大小王可以看成任意的 数字。

package sample.java;

import java.text.SimpleDateFormat;
import java.util.*;

public class Main {
    public static void main(String args[]) {
        Main test = new Main();
        int[] array={0,4,6,8,0};
        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;i0;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,如果4修改为3则为false

思路:
第一步:首先把大小王的值默认设置为0,然后计算出随机抽取出来的王的个数,用numberZero表示。在示例中int array = [0,4,6,8,0],即第一个和最后一个为抽取出来的两个王,所以numberZero为2.
第二步:从新排序数组,安从小到大的顺序:[0,0,4,6,8]
为了明白接下来的说明,引入一个名词:坡度,对应示例中的numberGap。我们定义坡度为数组相邻两个值的差减去1(此处的数组为去掉大小王也就是去掉0之后的数组,比如[4,6,8]).统计出所有的相邻坡度和:6和4的坡度为1,8和6的坡度为1.所以数组的总坡度为1+1=2.该示例中计算坡度的代码:

while(big < number.length){
            if(number[small]==number[big])
                return false;
            numberGap += number[big] - number[small]-1;
            //等于numberGap = numberGap + (number[big] - number[small] - 1);
            small=big;
            big++;
        }

在该示例中计算坡度numberGap结果为2。
第三步:如果大小王也就是0的个数小于总坡度数,则随机抽取的牌不是连续的,反之则连续。

对比生活中的例子:比如盖楼梯,一阶是一块砖,有时候失误一阶高度变成了两块砖或三块砖,此刻修补的方法就是你手里有几个王,一个王就可以弥补一阶的失误。

你可能感兴趣的:(Java,算法)