扑克牌中的顺子:从一副扑克牌中抽取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));
}
}