题目地址:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/
从扑克牌中随机抽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] .
这道题看题意,顺子,首先是五个连号,那么这五个之内就不能出现重复,且如果漏了的就用joker补。只要保证最大-最小>5,且无重复就一定会有顺子,因此我们引出第一个爆破法
一、爆破法一
用set保存,查看是否重复,如果遍历到0就跳过,并且设置最大最小值。
如果最大-最小<5,且无重复则一定是顺子
执行结果如下:
203 / 203 个通过测试用例
状态:通过
执行用时: 1 ms
内存消耗: 35.9 MB
public boolean isStraightMe(int[] nums) {
int max = 0, min = 14;
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if(0 == nums[i]) continue;
if(set.contains(nums[i])) return false;
max = Math.max(max, nums[i]);
min = Math.min(min, nums[i]);
set.add(nums[i]);
}
return max - min < 5;
}
二、评论区大佬法
评论区大佬的办法先排序,然后遍历到0就joker++,如果出现重复提前返回false,最后从非0开始到最后一位数只要差值小于5则说明是顺子
执行结果如下:
203 / 203 个通过测试用例
状态:通过
执行用时: 1 ms
内存消耗: 35.9 MB
public boolean isStraight(int[] nums) {
int joker = 0;
Arrays.sort(nums);
for (int i = 0; i < 4; i++) {
if (0 == nums[i]) {
joker++;
} else if (nums[i] == nums[i + 1]) {
return false;
}
}
return (nums[4] - nums[joker]) < 5;
}
时间和空间上没什么差别,但评论区大佬的办法显然更加巧妙