剑指 Offer 61. 扑克牌中的顺子

261 阅读1分钟

剑指 Offer 61. 扑克牌中的顺子

题目要求

  • 从若干副扑克牌中随机抽 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;
};