java-67-扑克的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大

java-67-扑克牌的顺子.从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2-10为数字本身,A为1,J为11,Q为12,K为13,而大
import java.util.Arrays;
import java.util.Random;


public class ContinuousPoker {

	/**Q67 扑克牌的顺子
	 * 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。
	 * 2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。
	 */
	private static final int[] poker={
		0,0
		,1,2,3,4,5,6,7,8,9,10,11,12,13
		,1,2,3,4,5,6,7,8,9,10,11,12,13
		,1,2,3,4,5,6,7,8,9,10,11,12,13
		,1,2,3,4,5,6,7,8,9,10,11,12,13};
	private static final int MAX=5;
	private static final int MAX_VAL=13;
	
	public static void main(String[] args) {
		//test 1.Specific data for test.
		int[][] testData={
				{7,8,0,10,11},
				{7,8,0,0,11},
				{8,9,9,10,11},
				{7,8,9,10,11},
		};
		for(int[] pokerSelected:testData){
			test(pokerSelected);
		}
		//test 2.Imitate the real situation:Select 5 poker randomly.
		int[] pokerSelected=randomSelect(poker,MAX);
		test(pokerSelected);
		
	}
	
	public static void test(int[] pokerSelected){
		System.out.println(Arrays.toString(pokerSelected));
		boolean continuous=isContinuous(pokerSelected);
		System.out.println("continuous is "+continuous);
	}

	/*
1)确认5张牌中除了0,其余数字没有重复的(可以用表统计的方法);
2) 满足这样的逻辑:(max,min分别代表5张牌中的除0以外的最大值最小值)
       如果没有0,则max-min=4,则为顺子,否则不是
       如果有一个0,则max-min=4或者3,则为顺子,否则不是
       如果有两个0,则max-min=4或者3或者2,则为顺子,否则不是
最大值和最小值在1)中就可以获得
	 */
	public static boolean isContinuous(int[] x){
		int[] existTimes=new int[MAX_VAL+1];
		boolean result=false;
		int len=x.length;
		int max=x[0],min=x[0];
		int zeroCount=0;
		for(int i=0;i<len;i++){
			existTimes[x[i]]++;//record the number of occurrences
			if(x[i]==0){
				zeroCount++;
			}else{
				if(x[i]>max)max=x[i];
				if(x[i]<min)min=x[i];
			}
		}
		for(int i=1;i<MAX_VAL;i++){//i starts from 1,exclude '0'
			if(existTimes[i]>1){//duplicate non-zero element
				return false;
			}
		}
		if(zeroCount==0){
			if(max-min==MAX-1)result=true;
		}else if(zeroCount==1){
			if(max-min==MAX-1 || max-min==MAX-2)result=true;
		}else if(zeroCount==2){
			if(max-min==MAX-1  || max-min==MAX-2  || max-min==MAX-3)result=true;
		}
		
		return result;
	}
	
	/*
	 * @param count how many elements you want to pick
	 * @param data the data array
	 */
	public static int[] randomSelect(int[] data,int count){
		int[] result=new int[count];
		int len=data.length;
		for(int i=0;i<count;i++){
			Random random=new Random();
			int pos=random.nextInt(len);
			result[i]=data[pos];//pick out the element 
			data[pos]=data[len-1];//and replace it with the last element
			len--;
		}
		return result;
	}
}