Skip to content

Commit 0ddc119

Browse files
committed
feat: add solutions to lcof problem: No.61
1 parent deda2fe commit 0ddc119

File tree

7 files changed

+155
-182
lines changed

7 files changed

+155
-182
lines changed

lcof/面试题61. 扑克牌中的顺子/README.md

+86-104
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,16 @@
3434

3535
<!-- 这里可写通用的实现逻辑 -->
3636

37-
顺子不成立的核心条件:
37+
**方法一:遍历**
3838

39-
- 存在重复。
40-
- 最大值与最小值的差距超过 4(最大最小值比较不包括 0 在内)。
39+
我们首先明确顺子不成立的核心条件:
4140

42-
解决方案:
41+
1. 存在非 $0$ 的重复。
42+
2. 最大值与最小值的差距超过 4(最大最小值比较不包括 $0$ 在内)。
4343

44-
- 数组计数
44+
因此,我们可以用一个哈希表或数组 `vis` 记录数字是否出现过,用 `mi``mx` 记录最大值和最小值。遍历数组,忽略大小王($0$),求出数组的最大、最小值。若最后差值超过 $4$,则无法构成顺子。
4545

46-
- 用数组 `t` 记录是否存在重复的数,存在则直接返回 `false`
47-
- 遍历数组,忽略大小王(0),求出数组的最大、最小值。若最后差值超过 4,则无法构成顺子,例如:`5,6,(0),8,10`
48-
49-
- 排序
50-
- 声明一个起始指针,初始化为 0。
51-
- 对数组进行排序,并遍历数组:
52-
- 若遍历元素为 0,将起始指针向右移。
53-
- 若遍历元素与相邻元素相同(忽略 0),则绝对不成立,`return false`
54-
- 遍历结束,比较最大值(数组末尾元素)与起始指针所指向的元素,若是两者值相差大于 4,则顺子不成立。
55-
> 起始指针所做的便是找到除 0 之外,数组当中的最小值。
46+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组长度。
5647

5748
<!-- tabs:start -->
5849

@@ -63,17 +54,17 @@
6354
```python
6455
class Solution:
6556
def isStraight(self, nums: List[int]) -> bool:
66-
t = [False for _ in range(14)]
67-
max_val, min_val = 0, 14
68-
for num in nums:
69-
if num == 0:
57+
vis = set()
58+
mi, mx = inf, -inf
59+
for x in nums:
60+
if x == 0:
7061
continue
71-
if t[num]:
62+
if x in vis:
7263
return False
73-
t[num] = True
74-
max_val = max(max_val, num)
75-
min_val = min(min_val, num)
76-
return max_val - min_val <= 4
64+
vis.add(x)
65+
mi = min(mi, x)
66+
mx = max(mx, x)
67+
return mx - mi <= 4
7768
```
7869

7970
### **Java**
@@ -83,79 +74,44 @@ class Solution:
8374
```java
8475
class Solution {
8576
public boolean isStraight(int[] nums) {
86-
boolean[] t = new boolean[14];
87-
int maxVal = Integer.MIN_VALUE, minVal = Integer.MAX_VALUE;
88-
for (int num : nums) {
89-
if (num == 0) {
77+
boolean[] vis = new boolean[14];
78+
int mi = 20, mx = -1;
79+
for (int x : nums) {
80+
if (x == 0) {
9081
continue;
9182
}
92-
if (t[num]) {
83+
if (vis[x]) {
9384
return false;
9485
}
95-
t[num] = true;
96-
maxVal = Math.max(maxVal, num);
97-
minVal = Math.min(minVal, num);
86+
vis[x] = true;
87+
mi = Math.min(mi, x);
88+
mx = Math.max(mx, x);
9889
}
99-
return maxVal - minVal <= 4;
90+
return mx - mi <= 4;
10091
}
10192
}
10293
```
10394

104-
### **JavaScript**
105-
106-
```js
107-
/**
108-
* @param {number[]} nums
109-
* @return {boolean}
110-
*/
111-
var isStraight = function (nums) {
112-
let zeroCnt = 0;
113-
nums.sort((a, b) => a - b);
114-
for (let i = 0; i < nums.length - 1; i++) {
115-
if (nums[i] === 0) zeroCnt++;
116-
else {
117-
if (nums[i] === nums[i + 1]) return false;
118-
else if (nums[i] === nums[i + 1] - 1) {
119-
continue;
120-
} else if (nums[i] >= nums[i + 1] - zeroCnt - 1) {
121-
zeroCnt--;
122-
} else {
123-
return false;
124-
}
125-
}
126-
if (zeroCnt < 0) return false;
127-
}
128-
return true;
129-
};
130-
```
131-
13295
### **C++**
13396

13497
```cpp
13598
class Solution {
13699
public:
137100
bool isStraight(vector<int>& nums) {
138-
if (nums.size() != 5) {
139-
return false;
140-
}
141-
142-
std::sort(nums.begin(), nums.end());
143-
int zeroNum = 0;
144-
for (int i = 0; i < nums.size(); i++) {
145-
if (nums[i] != 0) {
146-
// 这题的用例中,会出现超过两个0的情况
147-
break;
101+
bool vis[14]{};
102+
int mi = 20, mx = -1;
103+
for (int& x : nums) {
104+
if (x == 0) {
105+
continue;
148106
}
149-
zeroNum++;
150-
}
151-
152-
for (int i = zeroNum; i < nums.size() - 1; i++) {
153-
if (nums[i] == nums[i + 1]) {
107+
if (vis[x]) {
154108
return false;
155109
}
110+
vis[x] = true;
111+
mi = min(mi, x);
112+
mx = max(mx, x);
156113
}
157-
158-
return nums[4] - nums[zeroNum] <= 4;
114+
return mx - mi <= 4;
159115
}
160116
};
161117
```
@@ -164,37 +120,63 @@ public:
164120
165121
```go
166122
func isStraight(nums []int) bool {
167-
m := make(map[int]struct{})
168-
mi, ma := 14, 0
169-
for _, num := range nums {
170-
if num == 0 {
123+
vis := map[int]bool{}
124+
mi, mx := 20, -1
125+
for _, x := range nums {
126+
if x == 0 {
171127
continue
172128
}
173-
if _, exist := m[num]; exist {
129+
if vis[x] {
174130
return false
175131
}
176-
mi = min(mi, num)
177-
ma = max(ma, num)
178-
m[num] = struct{}{}
132+
vis[x] = true
133+
mi = min(mi, x)
134+
mx = max(mx, x)
179135
}
180-
return ma-mi < 5
136+
return mx-mi <= 4
181137
}
182138
183-
func max(x, y int) int {
184-
if x > y {
185-
return x
139+
func min(a, b int) int {
140+
if a < b {
141+
return a
186142
}
187-
return y
143+
return b
188144
}
189145
190-
func min(x, y int) int {
191-
if x < y {
192-
return x
146+
func max(a, b int) int {
147+
if a > b {
148+
return a
193149
}
194-
return y
150+
return b
195151
}
196152
```
197153

154+
### **JavaScript**
155+
156+
```js
157+
/**
158+
* @param {number[]} nums
159+
* @return {boolean}
160+
*/
161+
var isStraight = function (nums) {
162+
const vis = new Array(14).fill(false);
163+
let mi = 20;
164+
let mx = -1;
165+
for (const x of nums) {
166+
if (x == 0) {
167+
continue;
168+
}
169+
if (vis[x]) {
170+
return false;
171+
}
172+
vis[x] = true;
173+
mi = Math.min(mi, x);
174+
mx = Math.max(mx, x);
175+
}
176+
return mx - mi <= 4;
177+
};
178+
```
179+
198180
### **TypeScript**
199181

200182
```ts
@@ -236,20 +218,20 @@ impl Solution {
236218
```cs
237219
public class Solution {
238220
public bool IsStraight(int[] nums) {
239-
bool[] t = new bool[14];
240-
int max_val = 0, min_val = 14;
241-
foreach(var num in nums) {
242-
if (num == 0) {
221+
bool[] vis = new bool[14];
222+
int mi = 20, mx = -1;
223+
foreach(int x in nums) {
224+
if (x == 0) {
243225
continue;
244226
}
245-
if (t[num]) {
227+
if (vis[x]) {
246228
return false;
247229
}
248-
t[num] = true;
249-
max_val = Math.Max(max_val, num);
250-
min_val = Math.Min(min_val, num);
230+
vis[x] = true;
231+
mi = Math.Min(mi, x);
232+
mx = Math.Max(mx, x);
251233
}
252-
return max_val - min_val <= 4;
234+
return mx - mi <= 4;
253235
}
254236
}
255237
```
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,19 @@
11
class Solution {
22
public:
33
bool isStraight(vector<int>& nums) {
4-
if (nums.size() != 5) {
5-
return false;
6-
}
7-
8-
std::sort(nums.begin(), nums.end());
9-
int zeroNum = 0;
10-
for (int i = 0; i < nums.size(); i++) {
11-
if (nums[i] != 0) {
12-
// 这题的用例中,会出现超过两个0的情况
13-
break;
4+
bool vis[14]{};
5+
int mi = 20, mx = -1;
6+
for (int& x : nums) {
7+
if (x == 0) {
8+
continue;
149
}
15-
zeroNum++;
16-
}
17-
18-
for (int i = zeroNum; i < nums.size() - 1; i++) {
19-
if (nums[i] == nums[i + 1]) {
10+
if (vis[x]) {
2011
return false;
2112
}
13+
vis[x] = true;
14+
mi = min(mi, x);
15+
mx = max(mx, x);
2216
}
23-
24-
return nums[4] - nums[zeroNum] <= 4;
17+
return mx - mi <= 4;
2518
}
26-
};
19+
};
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
public class Solution {
22
public bool IsStraight(int[] nums) {
3-
bool[] t = new bool[14];
4-
int max_val = 0, min_val = 14;
5-
foreach(var num in nums) {
6-
if (num == 0) {
3+
bool[] vis = new bool[14];
4+
int mi = 20, mx = -1;
5+
foreach(int x in nums) {
6+
if (x == 0) {
77
continue;
88
}
9-
if (t[num]) {
9+
if (vis[x]) {
1010
return false;
1111
}
12-
t[num] = true;
13-
max_val = Math.Max(max_val, num);
14-
min_val = Math.Min(min_val, num);
12+
vis[x] = true;
13+
mi = Math.Min(mi, x);
14+
mx = Math.Max(mx, x);
1515
}
16-
return max_val - min_val <= 4;
16+
return mx - mi <= 4;
1717
}
1818
}
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
func isStraight(nums []int) bool {
2-
m := make(map[int]struct{})
3-
mi, ma := 14, 0
4-
for _, num := range nums {
5-
if num == 0 {
2+
vis := map[int]bool{}
3+
mi, mx := 20, -1
4+
for _, x := range nums {
5+
if x == 0 {
66
continue
77
}
8-
if _, exist := m[num]; exist {
8+
if vis[x] {
99
return false
1010
}
11-
mi = min(mi, num)
12-
ma = max(ma, num)
13-
m[num] = struct{}{}
11+
vis[x] = true
12+
mi = min(mi, x)
13+
mx = max(mx, x)
1414
}
15-
return ma-mi < 5
15+
return mx-mi <= 4
1616
}
1717

18-
func max(x, y int) int {
19-
if x > y {
20-
return x
18+
func min(a, b int) int {
19+
if a < b {
20+
return a
2121
}
22-
return y
22+
return b
2323
}
2424

25-
func min(x, y int) int {
26-
if x < y {
27-
return x
25+
func max(a, b int) int {
26+
if a > b {
27+
return a
2828
}
29-
return y
30-
}
29+
return b
30+
}

0 commit comments

Comments
 (0)