題目:從撲克牌中隨機抽出5張牌,判斷是否是一個順子,即這五張牌是否是連續的。2——10爲數字自己,A爲1,J爲11,Q爲12,K爲13,而大小王爲任意數字。java
咱們須要把撲克牌的背景抽象成計算機語言。不難想象,咱們能夠把五張牌當作由五個數字組成的數組。大小王是特殊的數字,咱們不妨把他們定義爲0,這樣就能和其餘牌區分開來了。數組
接下來咱們分析判斷5個數字是否是連續的,最直觀的方法是把數組排 序。值得注意的是,因爲0能夠當成任意的數字,咱們能夠用0去補滿數組中的空缺。若是排序以後的數組不是連續的,即相鄰的兩個數字像個若干個數字,但只要 咱們有足夠的0能夠補滿這兩個空缺的數字,這個數組實際上仍是連續的。舉個例子,數組排序以後爲{0,1,3,4,5},在1和3之間空缺一個2,恰好我 們有一個0,也就是咱們能夠把它當成2去填補這個空缺。排序
因而咱們須要作3件事:首先把數組排序,再統計數組中0的個數,最後統計排序以後數組中相鄰的數字之間的空缺總數。若是空缺綜述小於或者等於0的個數,那麼這個數組就是連續的;反之則不連續。class
最後咱們還須要注意一點:若是數組中的非0數字反覆出現,則該數組不是連續的。換成撲克牌的描述方式就是若是一副牌裏含有對子,則不多是順子。test
基於這個思路,咱們實現咱們的代碼:import
package cglib;方法
import java.util.Arrays;im
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;
}
}sort
輸出:
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