剑指 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
解法一:集合 Set + 遍历
根据题意,此 5 张牌是顺子的 充分条件 如下:
- 除大小王外,所有牌 无重复 ;
- 设此 5 张牌中最大的牌为 max ,最小的牌为 min (大小王除外),则需满足max - min < 5
var isStraight = function(nums) {
let min = 14, max = 0
const set = new Set()
for(let n of nums){
if(n === 0) continue
max = Math.max(max, n)
min = Math.min(min, n)
if(set.has(n)) return false
set.add(n)
}
return max - min < 5
};
解法二:排序 + 遍历
var isStraight = function(nums) {
let j = 0
nums.sort((a,b) => a-b)
for(let i = 0; i < 4; i ++){
if(nums[i] === 0) j++
else if(nums[i] === nums[i+1]) return false
}
return nums[nums.length - 1] - nums[j] < 5
};
写法二
var isStraight = function(nums) {
let arr = nums.filter((n) => n > 0).sort((a,b) => a-b)
let set = [...new Set(arr)]
if(set.length === arr.length){
return set[set.length - 1] - set[0] < 5
}else{
return false
}
};