剑指offer_61_扑克牌中的顺子【javascript】

106 阅读1分钟

题目链接

leetcode.cn/problems/bu…

题目(简单)

从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。2~10 为数字本身,A为 1,J为11,Q为 12,K为 13,而大、小王可以看成任意数字。

示例

示例 1:
输入: nums = [0, 6, 9, 0, 7]
输出: True
 
示例 2:
输入: nums = [7, 8, 9, 10, 11]
输出: True

提示:

  • nums.length = 5
  • 0 <= nums[i] <= 13

题解

遍历

  • 时间复杂度 O(1)
  • 空间复杂度 O(1)
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var isStraight = function (nums) {
  let numberOfZero = 0;
  nums.sort((a, b) => a - b);
  let numsCount = 5;
  for (let i = 0; i < numsCount - 1; i++) {
    if (nums[i] === 0) {
      numberOfZero++;
    } else if (nums[i] === nums[i + 1]) {
      return false;
    }
  }
  return nums[4] - nums[numberOfZero] < 5;
};

集合

  • 时间复杂度 O(1)
  • 空间复杂度 O(1)
/**
 * @param {number[]} nums
 * @return {boolean}
 */
var isStraight = function (nums) {
  let set = new Set();
  let max = 0,
    min = 14;
  for (let a of nums) {
    // 跳过大小王;
    if (a == 0) continue;
    max = Math.max(a, max);
    min = Math.min(a, min);
    // 若有重复,提前返回 false
    if (set.has(a)) return false;
    set.add(a);
  }
  // 最大牌 - 最小牌 < 5 则可构成顺子
  return max - min < 5;
};