1. 题目描述

从扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这 5 张牌是不是连续的。

2 ~ 10 为数字本身,A 为 1,J 为 11,Q 为 12,K 为 13,而大、小王可以看成任意数字。

2. 思路分析

难度不大,可以将大小王看成数字 0,可以在任何不连续的两个数字之间做填充。

首先将原数组排序,然后统计任意数字(0)的出现次数。再遍历之后的数字,找出不相邻数字之间总共差多少个数字。

最后比较 0 的出现次数和总共差多少个数字,两者的大小关系。

注意:连续两个相同的数字是对子,不符合要求。

3. 代码实现

/**
 *
 * @param {Array} numbers
 */
function isContinuous(numbers) {
  numbers.sort();
  const length = numbers.length;

  let zeroNum = 0;
  for (let i = 0; i < length && !numbers[i]; ++i) {
    ++zeroNum;
  }

  let interval = 0;
  for (let i = zeroNum + 1; i < length - 1; ++i) {
    if (numbers[i] === numbers[i + 1]) {
      return false;
    }
    interval += numbers[i + 1] - numbers[i] - 1;
  }

  return interval <= zeroNum;
}

/**
 * 测试代码
 */
console.log(isContinuous([3, 8, 0, 0, 1])); // false
console.log(isContinuous([8, 10, 0, 6, 0])); // true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29