撲克牌中的順子:從一副撲克牌中抽取5張,判斷是不是一個順子。 2- 10 爲自身,A 爲1 JQK爲11 12 13,大小王爲任意數
先按從小到大對5張牌進行排序
首先判斷大小王個數K(只能爲0 1 2)
然後判斷不連續的間隔之和M,比較M和K的大小;如果在遍歷的過程中出現了對子,那麼就直接退出,不可能再形成順子
public class _Q44<T> {
public boolean IsContinuous(int nums[]){
if(nums == null) return false;
if(nums.length < 5) return false;
// 採用hash表進行排序
int hash[] = new int[14];
for(int i=0; i<nums.length; i++){
hash[nums[i]]++;
}
int index = 0;
for(int i=0; i<hash.length; i++){
while(hash[i] > 0){
nums[index++] = i;
hash[i]--;
}
}
boolean result = false;
int numberOfZero = 0;
int numberOfGap = 0;
// 查找大小王個數
for(int i=0; i<nums.length; i++){
if(nums[i] == 0) numberOfZero++;
else break;
}
for(int i=numberOfZero; i<(nums.length - 1); i++){
// 出現對子
if(nums[i+1] == nums[i]) {
numberOfGap = numberOfZero + 1;
result = false;
break;
}else{
numberOfGap += nums[i+1] - nums[i] - 1;
}
}
// 判斷大小王是否可以填補空缺
if(numberOfZero >= numberOfGap) result = true;
return result;
}
}
測試代碼:
public class _Q44Test extends TestCase {
_Q44<?> poker = new _Q44();
public void test(){
int pokers1[] = {0, 4, 5, 3, 1};
int pokers2[] = {0, 0, 5, 3, 1};
int pokers3[] = {0, 0, 11, 3, 1}; // 間隔較大
int pokers4[] = {2, 3, 4, 3, 1}; // 含有對子
int pokers5[] = null;
System.out.println(poker.IsContinuous(pokers1));
System.out.println(poker.IsContinuous(pokers2));
System.out.println(poker.IsContinuous(pokers3));
System.out.println(poker.IsContinuous(pokers4));
System.out.println(poker.IsContinuous(pokers5));
}
}