题目要求
- 从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。
- A为1,2~10为数字本身,J为11,Q为12,K为13
- 大、小王为 0 ,可以看成任意数字。
分析
一个顺子 它的最大值和最小值 肯定是<=5,为什么有小于5的情况呢?这是因为大小王可以当做癞子,
虽然值为0,比如[0,0,1,3,5],癞子可以让这五张牌变成[1,2,3,4,5],虽然实际上符合题意,但是
[0,0,1,3,5]最大值5 和 最小值1 差值小于5的,为什么最小值不是0呢?因为比较特殊,所以在代码里,但凡有0的存在应该排除在外
代码实现如下所示
初始化最大值 和 最小值 这是为了后续和每一项做最值比较 然后遍历数组每一项,如果遇到是癞子的,则先不处理, 找到最大值 和 最小值,把每一项的值存入Set结构中,如果在Set结构已经存在该值,则直接返回false,就是说,有重复了,肯定不是顺子,等遍历完成后,如果最大值和最小值差值 小于5说明就是顺子了
const isStraight = nums => {
const set = new Set();
let [max, min] = [0, 14];
for (const num of nums) {
if (num === 0) continue;
max = Math.max(max, num);
min = Math.min(min, num);
if (set.has(num)) return false;
set.add(num);
}
return max - min < 5;
};