Skip to content

Commit 949a6c7

Browse files
committed
✅ test: update tests
1 parent 7c3e3dc commit 949a6c7

File tree

5 files changed

+205
-128
lines changed

5 files changed

+205
-128
lines changed
+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
[
2+
{
3+
"input": [
4+
6,
5+
[
6+
[1, 2, 5],
7+
[2, 3, 8],
8+
[1, 5, 10]
9+
],
10+
1
11+
],
12+
"answer": [0, 1, 2, 3, 5]
13+
},
14+
{
15+
"input": [
16+
4,
17+
[
18+
[3, 1, 3],
19+
[1, 2, 2],
20+
[0, 3, 3]
21+
],
22+
3
23+
],
24+
"answer": [0, 1, 3]
25+
},
26+
{
27+
"input": [
28+
5,
29+
[
30+
[3, 4, 2],
31+
[1, 2, 1],
32+
[2, 3, 1]
33+
],
34+
1
35+
],
36+
"answer": [0, 1, 2, 3, 4]
37+
},
38+
{
39+
"input": [
40+
6,
41+
[
42+
[0, 2, 1],
43+
[1, 3, 1],
44+
[4, 5, 1]
45+
],
46+
1
47+
],
48+
"answer": [0, 1, 2, 3]
49+
}
50+
]

Diff for: packages/findset/README.md

+69
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,75 @@ amortized constant time complexity:
147147
findset.getSetOf(2) // => Set {1, 2}
148148
```
149149

150+
### Example
151+
152+
* A solution for leetcode "Find All People With Secret"
153+
(https://leetcode.com/problems/find-all-people-with-secret/):
154+
155+
```typescript
156+
import { createEnhancedFindset } from '@algorithm.ts/findset'
157+
import type { IEnhancedFindset } from '@algorithm.ts/findset'
158+
159+
const MAX_N = 1e5 + 10
160+
const answer: Set<number> = new Set()
161+
const nodes: Set<number> = new Set()
162+
const visited: Uint8Array = new Uint8Array(MAX_N)
163+
const findset: IEnhancedFindset = createEnhancedFindset(MAX_N)
164+
165+
export function findAllPeople(N: number, meetings: number[][], firstPerson: number): number[] {
166+
const M: number = meetings.length
167+
168+
answer.clear()
169+
answer.add(1)
170+
answer.add(firstPerson + 1)
171+
172+
meetings
173+
.sort((x, y) => x[2] - y[2])
174+
.forEach(item => {
175+
item[0] += 1
176+
item[1] += 1
177+
})
178+
179+
for (let i = 0, j: number; i < M; i = j) {
180+
const t: number = meetings[i][2]
181+
for (j = i + 1; j < M; ++j) {
182+
if (meetings[j][2] !== t) break
183+
}
184+
185+
nodes.clear()
186+
for (let k = i; k < j; ++k) {
187+
const [x, y] = meetings[k]
188+
nodes.add(x)
189+
nodes.add(y)
190+
}
191+
192+
for (const x of nodes) {
193+
findset.initNode(x)
194+
visited[x] = 0
195+
}
196+
197+
for (let k = i; k < j; ++k) {
198+
const [x, y] = meetings[k]
199+
findset.merge(x, y)
200+
}
201+
202+
for (const x of nodes) {
203+
if (!answer.has(x)) continue
204+
205+
const xx: number = findset.root(x)
206+
if (visited[xx]) continue
207+
visited[xx] = 1
208+
209+
const xxSet: Set<number> = findset.getSetOf(xx)!
210+
for (const t of xxSet) answer.add(t)
211+
}
212+
}
213+
214+
return Array.from(answer)
215+
.map(x => x - 1)
216+
.sort((x, y) => x - y)
217+
}
218+
```
150219

151220
## Related
152221

Diff for: packages/findset/__test__/findset.spec.ts

+6-128
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
/* eslint-disable no-param-reassign */
21
import { randomInt } from '@algorithm.ts/knuth-shuffle'
3-
import type { IEnhancedFindset } from '../src'
2+
import { testOjCodes } from 'jest.setup'
43
import { createEnhancedFindset, createFindset, createHeuristicFindset } from '../src'
54

6-
describe('createfindset', function () {
5+
describe('createFindset', function () {
76
const MAX_N = 1000
87
const findset = createFindset(MAX_N)
98

@@ -53,7 +52,7 @@ describe('createfindset', function () {
5352
})
5453
})
5554

56-
describe('createHeuristicfindset', function () {
55+
describe('createHeuristicFindset', function () {
5756
const MAX_N = 1000
5857
const findset = createHeuristicFindset(MAX_N)
5958

@@ -173,128 +172,7 @@ describe('enhanced-findset', function () {
173172
})
174173
})
175174

176-
describe('leetcode', function () {
177-
test('2092 Find All People With Secret', function () {
178-
const solve = createSolve()
179-
const data: Array<{ input: Parameters<typeof solve>; answer: number[] }> = [
180-
{
181-
input: [
182-
6,
183-
[
184-
[1, 2, 5],
185-
[2, 3, 8],
186-
[1, 5, 10],
187-
],
188-
1,
189-
],
190-
answer: [0, 1, 2, 3, 5],
191-
},
192-
{
193-
input: [
194-
4,
195-
[
196-
[3, 1, 3],
197-
[1, 2, 2],
198-
[0, 3, 3],
199-
],
200-
3,
201-
],
202-
answer: [0, 1, 3],
203-
},
204-
{
205-
input: [
206-
5,
207-
[
208-
[3, 4, 2],
209-
[1, 2, 1],
210-
[2, 3, 1],
211-
],
212-
1,
213-
],
214-
answer: [0, 1, 2, 3, 4],
215-
},
216-
{
217-
input: [
218-
6,
219-
[
220-
[0, 2, 1],
221-
[1, 3, 1],
222-
[4, 5, 1],
223-
],
224-
1,
225-
],
226-
answer: [0, 1, 2, 3],
227-
},
228-
]
229-
for (const kase of data) {
230-
const [N, meetings, firstPerson] = kase.input
231-
expect(solve(N, meetings, firstPerson)).toEqual(kase.answer)
232-
}
233-
234-
function createSolve(): (N: number, meetings: number[][], firstPerson: number) => number[] {
235-
const MAX_N = 1e5 + 10
236-
const answer: Set<number> = new Set()
237-
const nodes: Set<number> = new Set()
238-
const visited: Uint8Array = new Uint8Array(MAX_N)
239-
const findset: IEnhancedFindset = createEnhancedFindset(MAX_N)
240-
241-
return function findAllPeople(
242-
N: number,
243-
meetings: number[][],
244-
firstPerson: number,
245-
): number[] {
246-
const M: number = meetings.length
247-
248-
answer.clear()
249-
answer.add(1)
250-
answer.add(firstPerson + 1)
251-
252-
meetings
253-
.sort((x, y) => x[2] - y[2])
254-
.forEach(item => {
255-
item[0] += 1
256-
item[1] += 1
257-
})
258-
259-
for (let i = 0, j: number; i < M; i = j) {
260-
const t: number = meetings[i][2]
261-
for (j = i + 1; j < M; ++j) {
262-
if (meetings[j][2] !== t) break
263-
}
264-
265-
nodes.clear()
266-
for (let k = i; k < j; ++k) {
267-
const [x, y] = meetings[k]
268-
nodes.add(x)
269-
nodes.add(y)
270-
}
271-
272-
for (const x of nodes) {
273-
findset.initNode(x)
274-
visited[x] = 0
275-
}
276-
277-
for (let k = i; k < j; ++k) {
278-
const [x, y] = meetings[k]
279-
findset.merge(x, y)
280-
}
281-
282-
for (const x of nodes) {
283-
if (!answer.has(x)) continue
284-
285-
const xx: number = findset.root(x)
286-
if (visited[xx]) continue
287-
visited[xx] = 1
288-
289-
const xxSet: Set<number> = findset.getSetOf(xx)!
290-
for (const t of xxSet) answer.add(t)
291-
}
292-
}
293-
294-
return Array.from(answer)
295-
.map(x => x - 1)
296-
.sort((x, y) => x - y)
297-
}
298-
}
299-
})
175+
describe('oj', function () {
176+
// https://leetcode.com/problems/find-all-people-with-secret/
177+
testOjCodes('leetcode/find-all-people-with-secret', import('./oj/find-all-people-with-secret'))
300178
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { createEnhancedFindset } from '../../src'
2+
import type { IEnhancedFindset } from '../../src'
3+
4+
export default findAllPeople
5+
6+
const MAX_N = 1e5 + 10
7+
8+
const answer: Set<number> = new Set()
9+
const nodes: Set<number> = new Set()
10+
const visited: Uint8Array = new Uint8Array(MAX_N)
11+
const findset: IEnhancedFindset = createEnhancedFindset(MAX_N)
12+
13+
export function findAllPeople(N: number, meetings: number[][], firstPerson: number): number[] {
14+
const M: number = meetings.length
15+
16+
answer.clear()
17+
answer.add(1)
18+
answer.add(firstPerson + 1)
19+
20+
meetings
21+
.sort((x, y) => x[2] - y[2])
22+
.forEach(item => {
23+
item[0] += 1
24+
item[1] += 1
25+
})
26+
27+
for (let i = 0, j: number; i < M; i = j) {
28+
const t: number = meetings[i][2]
29+
for (j = i + 1; j < M; ++j) {
30+
if (meetings[j][2] !== t) break
31+
}
32+
33+
nodes.clear()
34+
for (let k = i; k < j; ++k) {
35+
const [x, y] = meetings[k]
36+
nodes.add(x)
37+
nodes.add(y)
38+
}
39+
40+
for (const x of nodes) {
41+
findset.initNode(x)
42+
visited[x] = 0
43+
}
44+
45+
for (let k = i; k < j; ++k) {
46+
const [x, y] = meetings[k]
47+
findset.merge(x, y)
48+
}
49+
50+
for (const x of nodes) {
51+
if (!answer.has(x)) continue
52+
53+
const xx: number = findset.root(x)
54+
if (visited[xx]) continue
55+
visited[xx] = 1
56+
57+
const xxSet: Set<number> = findset.getSetOf(xx)!
58+
for (const t of xxSet) answer.add(t)
59+
}
60+
}
61+
62+
return Array.from(answer)
63+
.map(x => x - 1)
64+
.sort((x, y) => x - y)
65+
}

Diff for: packages/priority-queue/__test__/priority-queue.spec.ts

+15
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,19 @@ describe('basic', function () {
9494
expect(output).toEqual(answer)
9595
}
9696
})
97+
98+
test('edge case', function () {
99+
const Q = createPriorityQueue<number>((x, y) => x - y)
100+
Q.init()
101+
Q.enqueue(0)
102+
Q.enqueue(2)
103+
104+
expect(Q.size()).toEqual(2)
105+
expect(Q.dequeue()).toEqual(2)
106+
expect(Q.size()).toEqual(1)
107+
expect(Q.dequeue()).toEqual(0)
108+
expect(Q.size()).toEqual(0)
109+
expect(Q.dequeue()).toEqual(undefined)
110+
expect(Q.size()).toEqual(0)
111+
})
97112
})

0 commit comments

Comments
 (0)