剑指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;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,如果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的个数小于总坡度数,则随机抽取的牌不是连续的,反之则连续。
对比生活中的例子:比如盖楼梯,一阶是一块砖,有时候失误一阶高度变成了两块砖或三块砖,此刻修补的方法就是你手里有几个王,一个王就可以弥补一阶的失误。