剑指offer41--扑克牌顺序

一、题目


题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。小王可以看成任意数字。



二、举例



题目:比如题目的顺序是{2,1,3,4,5}那么其输出结果是true,如果输入的数组是{0,5,6,1,7}那么其输出结果是false




三、思想



(1)对数组进行排序

(2)统计数组中0元素的个数

(3)排序后0肯定是在最前面的,所以可以找到数组中除0外最小的数字data[small]

(4)将data[big]和data[small]相减,最终得到相邻非零元素之间的差值

(5)将差值和0元素的个数相比较,最终就可以判断是true还是false了



四、程序



package 剑指offer;

import java.util.Arrays;

/*题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身,
 *A为1。 J为11、Q为12、 为13。小王可以看成任意数字。*/
public class Test46 {
	
	public static boolean isContinue(int []data){
		
		// 用来存储数字之间的间隔数,便于后边的比较
		int numberOfGap = 0;
		
		// 边界条件的判断
		if(data == null || data.length < 5){
			return false;
		}
		
		// 先将5个数进行排序
		Arrays.sort(data);
		
		// 统计5个数中零元素的个数
		int numberZero = 0;
		for(int i = 0; i < 5; i++){
			if(data[i] == 0){
				numberZero++;
			}
		}
		
		// 因为是排序之后的了,所以是第一个非零元素的位置
        int small = numberZero;
        int big = small + 1;
		
		while(big < data.length){
			if(data[small] == data[big]){
				return false;
			}
			
            numberOfGap += (data[big] - data[small] - 1);
            small = big;
            big++;
		}
		
		return numberOfGap <= numberZero;
	}

	public static void main(String args[]){
        int[] numbers1 = {1, 3, 2, 5, 4};
        System.out.println(isContinue(numbers1));       
        int[] numbers2 = {1, 3, 2, 6, 4};
        System.out.println(isContinue(numbers2));
        int[] numbers3 = {0, 3, 2, 6, 4};
        System.out.println(isContinue(numbers3));
        int[] numbers4 = {0, 3, 1, 6, 4};
        System.out.println(isContinue(numbers4));
	}
}


开始的时候忘掉了排序之后0就在最前面了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值