剑指 Offer 61. 扑克牌中的顺子
从扑克牌中随机抽5
张牌,判断是不是一个顺子,即这5
张牌是不是连续的。2~10
为数字本身,A
为1
,J
为11
,Q
为12
,K
为13
,而大、小王为0
,可以看成任意数字。A
不能视为 14
。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:
-
数组长度为 5
-
数组的数取值为 [0, 13] .
解题思路
- 考虑到
顺子就是由小到大连续的5个数
,所以我们先对数组排序
- 排序后,
0
应该在最前面,我们把0
找出来 - 从第一个不为
0
的数字开始,看看有没有相同的数,有的话肯定不可能是顺子了 - 判断不包含
0
的数字区间的长度是否小于等于5
,小于等于5
的话可以形成顺子,原因:- 总共就
5
个数字,我们已经断定没有对子,即除了0
,其他没有重复数字 - 不重复数字的起始和终止区间长度小于等于
5
,那要么就是5
个数字连成了顺子,要么就是中间缺了数,而缺的数字可以用0
补好。
- 总共就
Java代码
class Solution {
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int k = 0;
while(k < nums.length && nums[k] == 0) k++;
for(int i = k + 1;i < nums.length;i++){//判断0之后的数字中是否存在对子
if(nums[i] == nums[i - 1]){
return false;
}
}
return nums[nums.length - 1] - nums[k] + 1 <= 5; //区间长度是否小于等于5
}
}