题目:从扑克牌中随机抽出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