【剑指offer】61. 扑克牌中的顺子

136 阅读2分钟

题目描述

在这里插入图片描述

在这里插入图片描述

// 61. 扑克牌中的顺子


// 力扣
// 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的
// 。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,
// 可以看成任意数字。A 不能视为 14。


// 牛客
// LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王
// (一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能
// 不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王
// ,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王
// 可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1
// ,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现在
// ,要求你使用这幅牌模拟上面的过程,然后告诉我们LL的运气如何, 如果牌能组成
// 顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。


题解

// 力扣
// 先排除特殊情况,nums中不足5个牌直接false,
// 创建计数数组pokerList,记录每种牌出现的次数,有14种牌所以长度为14,
// 创建最大最小值max和min,用于记录5张牌的最大最小值,
// for循环遍历手牌num,出现次数累计一次pokerList[num]++,
// 如果num是0,跳过判断遍历下一张牌,
// 不是0的话,如果出现次数pokerList[num]大于1,说明有对子,有对子的牌
// 无法构成顺子,直接false。
// 以上不满足的话,如果num小于min,把min更新为num,
// 如果num大于max,把max更新为num。
// 循环结束,我们可以得到手牌中的最大值max和最小值min,
// 在没有重复对子的前提下,如果max-min的值小于等于4,则必定构成顺子,
// 返回true。比如max是5,min是1,说明其他三张牌一定是4 3 2和 0 这四种
// 情况,所以一定构成顺子。 
// 执行用时:1 ms, 在所有 Java 提交中击败了91.68%的用户
// 内存消耗:35.8 MB, 在所有 Java 提交中击败了59.10%的用户
class Solution {
    public boolean isStraight(int[] nums) {
		if (nums.length != 5)
			return false;
		int[] pokerList = new int[14];
		int max = Integer.MIN_VALUE;
		int min = Integer.MAX_VALUE;
		for (int num: nums) {
			pokerList[num]++;
			if (num == 0)
				continue;
			else if (pokerList[num] > 1)
				return false;
			if (num < min)
				min = num;
			if (num > max)
				max = num;
		}
		return (max - min <= 4);
    }
}




// 牛客
// 运行时间:13ms,超过72.54%用Java提交的代码
// 占用内存:9600KB,超过6.93%用Java提交的代码
public class Solution {
    public boolean IsContinuous(int [] numbers) {
        if (numbers.length != 5)
            return false;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        int[] poker = new int[14];
        for (int num: numbers) {
            poker[num]++;
            if (num == 0)
                continue;
            else if (poker[num] > 1)
                return false;
            if (num < min)
                min = num;
            if (num > max)
                max = num;
        }
        return (max - min <= 4);
    }
}