1. 题目描述

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

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

2. 思路分析

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

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

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

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

3. 代码实现

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
/**
*
* @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