剑指 Offer 61. 扑克牌中的顺子

题目说明

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

  • 数组长度为 5

  • 数组的数取值为 [0, 13] .

示例

例1

1
2
输入: [1,2,3,4,5]
输出: True

例2

1
2
输入: [0,0,1,2,5]
输出: True

笔者理解

此题是一道算法问题。

解法

当笔者阅读完此题后,发现此题是一道挺有意思的题目,读者们遍历一下扑克的分发可能情况就不难发现,有无大小王都可以算在一个情况里面,即发放的牌中的最大值和最小值的差值要小于5(不计算大小王及排除重复牌),一旦重复发放一张牌就构不成5张顺子了,而除去重复牌和是否有大小王的情况下,我们只需要讨论剩下牌即可。

让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public boolean isStraight(int[] nums) {
Set <Integer>set = new HashSet<Integer>();
//用set来存储元素,避免重复

int max = 0;
int min = 14;
//定义最大值最小值

for(int i = 0; i < nums.length; i++) {
if(nums[i]==0) { continue; }
//遍历到大小王就跳过

if(set.contains(nums[i])){
return false;
//存在重复元素一定不能构成5张连续顺子
}
max = Math.max(max,nums[i]);
min = Math.min(min,nums[i]);
set.add(nums[i]);
}
return max - min < 5;
//当最大值和最小值的差值小于5时,顺子成立
}

时间和空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是剑指offer的一道算法题,感兴趣的朋友都可以去尝试一下,此题还有其他的解法,朋友们可以自己逐一尝试。