剑指 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
}
}

637

被折叠的 条评论
为什么被折叠?



