转自几个面试经典算法题Java解答(http://www.cnblogs.com/sunniest/p/4596182.html)题目九
从一副扑克牌中抽取5张,判断能否组成顺子(即5个连续的数字),其中大小王可以充当任意数字。
我对代码做了一些改动,可以抽出最多15张,组成顺子0-14或1-15,大小王当0、14或是14.
public class CardContinuous {
public int getPivotLocation(int[] array , int begin , int end){
int pivot = array[begin];
while(begin < end){
while(begin < end && pivot <= array[end]){
end--;
}
array[begin] = array[end];
while(begin < end && array[begin] <= pivot){
begin++;
}
array[end] = array[begin];
}
array[begin] = pivot;
return begin;
}
public void quickSort(int[] array , int begin , int end){
if(array != null && array.length >= 2 && begin < end){
int position = getPivotLocation(array , begin , end);
quickSort(array , begin , position - 1);
quickSort(array , position + 1 , end);
}
}
public boolean isCardContinous(int[] num){
int[] card = new int[14];//记录每张牌数字出现的次数,0表示大小王
for(int n : num){
card[n]++;
}
quickSort(num , 0 , num.length - 1);//记录后把卡牌按照数字大小排序
int start;
int count = card[0];
//默认从一套牌中抽牌,大小王最多2张,start取值第一个非0数字
if(num[1] == 0){//当抽出2张王时start = num[2];}else if(num[0] == 0){//当抽出1张王时start = num[1];}else{//当没有王时start = num[0];}for(int i = start ; i < start + num.length && i < 14 ; i++){//计算从start起连续5个数中,有多少存在于抽出的牌中if(card[i] > 1){//如果某个非0数出现超过1次,那么不可能组成连续数字return false;}count += card[i];//记录范围中牌数字出现次数和}if(count == num.length){return true;}else{return false;}}public static void main(String[] args) {int[] num = {1 , 2 , 6, 0 , 0};CardContinuous cc = new CardContinuous();System.out.println(cc.isCardContinous(num));}}