Java实现——多张扑克牌是否能组成顺子

转自几个面试经典算法题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));}}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值