学习剑指offer 第17天
61 扑克牌中的顺子
- 题目描述
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。 - 解答:
法一:将扑克牌排序,并按照给出来的条件进行判断
- 如果为数字0,则进行记录
- 如果两个数字相等,则不会构成顺子
- 如果两个数字大于1,则观察是否能用0替补
public boolean isStraight(int[] nums) {
Arrays.sort(nums);
int zero_count = 0;
for(int i = 1; i < nums.length; i++){
//数字为0,可以代替任何
if(nums[i] == 0 || nums[i - 1] == 0){
zero_count++;
continue;
}
//数字相同,则不可能是递增
if(nums[i] - nums[i -1] == 0) return false;
//数字相差大于1,则用0来代替
if(nums[i] - nums[i -1] != 1){
if(nums[i] - nums[i - 1] - 1 > zero_count) return false;
else zero_count -= nums[i] - nums[i - 1] - 1;
}
}
return true;
}
法二:
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> record = new HashSet<>();
int max = -1;
int min = 14;
for(int i : nums){
//大小王不用判断
if(i == 0) continue;
//有重复的元素
if(record.contains(i)) return false;
record.add(i);
//寻找最大值最小值
max = Math.max(max, i);
min = Math.min(min, i);
}
//如果最大值最小值大于等于5,则说明不能构成顺子
return max - min < 5;
}
}