剑指 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
思路分析:本题在力扣上的标签是一道简单题,但是你可能刚看到题目会感觉很复杂,其实就是一组0到13的数,问你这组数是不是连续的,其中0可以看作任意数。
来判断是不是有序?那肯定先排个序再说。排完序后,那就开始看相邻元素了,有下面这四种情况。
1、如果相邻元素正好差一,那就往后遍历。
2、如果相邻元素相差大于1,那就需要拿0来补。
3、如果相邻元素就是0,那就直接跳过。
4、如果相邻元素相等,那么直接返回false,不可能成顺子。
所以我们在代码实现过程中,就围绕这几个判断进行。关于如何确定当相邻元素差不为1时,如何判断补全问题,这里提供两种思路:
一、那我们就看相邻元素中间隔了几个,和目前剩余的0数量进行比较,如果不够使,就直接返回false,如果够使,就进入下一层循环,记得更新0数量。
二、我们统计相邻元素差不为1的元素之间需要补上多少元素,在统计0元素数量,然后比较总数,如果0元素数量大于需要补上的元素数量,那就说明够使,返回true。否则false;
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int count = 0;
boolean flag = true;
int se = 0;
for(int i = 0; i < nums.length - 1; i++){
if(nums[i] == 0){
count += 1;
}else{
if(nums[i] == nums[i+1]){
return false;
}
if(nums[i]+1 != nums[i+1]){
se += nums[i+1] - nums[i] - 1;
}
}
}
return count >= se;
}