Skip to content

Commit 563c735

Browse files
committed
✨ feat: 扑克牌中的顺子
1 parent cd53b6d commit 563c735

File tree

5 files changed

+131
-0
lines changed

5 files changed

+131
-0
lines changed

DataStructure/Array/IsContinous.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"use strict";
2+
exports.__esModule = true;
3+
/**
4+
* 判断传入的一组扑克牌是否为一个顺子,2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可为任意数字。
5+
* @param {number[]} numbers
6+
* @return {boolean}
7+
*/
8+
function IsContinuous(numbers) {
9+
// 判断边界条件
10+
if (numbers === null || numbers.length < 1) {
11+
return false;
12+
}
13+
// 首先对numbers进行排序
14+
numbers = numbers.sort(function (a, b) { return (a - b); });
15+
var len = numbers.length;
16+
// 内部含有大小王的个数 大小王用0表示
17+
var numberOfZero = 0;
18+
// 内部间隔大小 2,4 表示1个间隔 2,5表示两个间隔
19+
var numberOfGap = 0;
20+
// 统计这组牌中大小王的个数
21+
for (var i = 0; i < len && numbers[i] === 0; i++) {
22+
numberOfZero++;
23+
}
24+
// 统计间隔大小
25+
var small = numberOfZero;
26+
var big = small + 1;
27+
while (big < len) {
28+
// 如果有对子 那么就不会为顺子
29+
if (numbers[small] === numbers[big]) {
30+
return false;
31+
}
32+
numberOfGap += numbers[big] - numbers[small] - 1;
33+
small = big;
34+
big++;
35+
}
36+
// 如果间隔数大于大小王的个数 那么就不为顺子
37+
return numberOfGap > numberOfZero ? false : true;
38+
}
39+
exports.IsContinuous = IsContinuous;

DataStructure/Array/IsContinous.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
/**
3+
* 判断传入的一组扑克牌是否为一个顺子,2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可为任意数字。
4+
* @param {number[]} numbers
5+
* @return {boolean}
6+
*/
7+
function IsContinuous (numbers: number[]): boolean {
8+
// 判断边界条件
9+
if (numbers === null || numbers.length < 1) {
10+
return false;
11+
}
12+
// 首先对numbers进行排序
13+
numbers = numbers.sort((a,b) => (a-b));
14+
let len = numbers.length;
15+
// 内部含有大小王的个数 大小王用0表示
16+
let numberOfZero = 0;
17+
// 内部间隔大小 2,4 表示1个间隔 2,5表示两个间隔
18+
let numberOfGap = 0;
19+
// 统计这组牌中大小王的个数
20+
for(let i = 0; i < len && numbers[i] === 0; i++) {
21+
numberOfZero++;
22+
}
23+
// 统计间隔大小
24+
let small = numberOfZero;
25+
let big = small + 1;
26+
while(big < len) {
27+
// 如果有对子 那么就不会为顺子
28+
if (numbers[small] === numbers[big]) {
29+
return false;
30+
}
31+
numberOfGap += numbers[big] - numbers[small] - 1;
32+
small = big;
33+
big++;
34+
}
35+
// 如果间隔数大于大小王的个数 那么就不为顺子
36+
return numberOfGap > numberOfZero ? false : true
37+
}
38+
39+
export {IsContinuous}

DataStructure/Test/Array.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {FindGreatestSum} from '../Array/FindGreatestSum'
1010
import {ReverseString} from '../Array/Reverse'
1111
import {MoveZero} from '../Array/MoveZero'
1212
import {ReorderOddEven} from '../Array/ReorderOddEven'
13+
import {IsContinuous} from '../Array/IsContinous'
1314

1415
test('FindNumWithSum', () => {
1516
expect(FindNumWithSum([1,2,3,4,5,6,7,8], 11)).toEqual([3,8])
@@ -58,4 +59,10 @@ test('MoveZero', () => {
5859

5960
test('ReorderOddEven', () => {
6061
expect(ReorderOddEven([1,3,4,5,6,7,8])).toEqual([1,3,7,5,6,4,8])
62+
})
63+
64+
test('IsContinous', () => {
65+
expect(IsContinuous([1,3,4,5,0])).toBe(true)
66+
expect(IsContinuous([1,3,4,5,7])).toBe(false)
67+
expect(IsContinuous([0,1,4,2,4])).toBe(false)
6168
})

docs/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ Questions on LeetCode
6060
- 连续子数组的最大和 | 剑指Offer [31]
6161
- 反转字符串 | LeetCode [344]
6262
- 按奇偶排序数组 | LeetCode [905] | 剑指Offer [14]
63+
- 扑克牌的顺子 | 剑指Offer [44]
6364

6465
### [字符串](./ds/String.md)
6566
- 最长公共前缀 | LeetCode [14]

docs/ds/Array.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,3 +556,48 @@ function FindGreatestSum (array: number[]):number {
556556
}
557557
```
558558

559+
## 判断是否为扑克牌顺子
560+
561+
> 此部分代码在 IsContinuous.ts 中
562+
563+
判断传入的一组扑克牌是否为一个顺子,2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可为任意数字。
564+
565+
```typescript
566+
/**
567+
* 判断传入的一组扑克牌是否为一个顺子,2-10为数字本身,A为1,J为11,Q为12,K为13,大小王可为任意数字。
568+
* @param {number[]} numbers
569+
* @return {boolean}
570+
*/
571+
function IsContinuous (numbers: number[]): boolean {
572+
// 判断边界条件
573+
if (numbers === null || numbers.length < 1) {
574+
return false;
575+
}
576+
// 首先对numbers进行排序
577+
numbers = numbers.sort((a,b) => (a-b));
578+
let len = numbers.length;
579+
// 内部含有大小王的个数 大小王用0表示
580+
let numberOfZero = 0;
581+
// 内部间隔大小 2,4 表示1个间隔 2,5表示两个间隔
582+
let numberOfGap = 0;
583+
// 统计这组牌中大小王的个数
584+
for(let i = 0; i < len && numbers[i] === 0; i++) {
585+
numberOfZero++;
586+
}
587+
// 统计间隔大小
588+
let small = numberOfZero;
589+
let big = small + 1;
590+
while(big < len) {
591+
// 如果有对子 那么就不会为顺子
592+
if (numbers[small] === numbers[big]) {
593+
return false;
594+
}
595+
numberOfGap += numbers[big] - numbers[small] - 1;
596+
small = big;
597+
big++;
598+
}
599+
// 如果间隔数大于大小王的个数 那么就不为顺子
600+
return numberOfGap > numberOfZero ? false : true
601+
}
602+
```
603+

0 commit comments

Comments
 (0)