Skip to content

Commit 7296540

Browse files
authored
Merge branch 'doocs:main' into main
2 parents b88c1ea + 3120cfe commit 7296540

File tree

263 files changed

+38764
-28764
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

263 files changed

+38764
-28764
lines changed

images/starcharts.svg

Lines changed: 27268 additions & 27167 deletions
Loading

lcof2/剑指 Offer II 109. 开密码锁/README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,47 @@ public:
236236
};
237237
```
238238
239+
#### Go
240+
241+
```go
242+
func openLock(deadends []string, target string) int {
243+
dead := map[string]bool{}
244+
for _, s := range deadends {
245+
dead[s] = true
246+
}
247+
if dead["0000"] {
248+
return -1
249+
}
250+
if target == "0000" {
251+
return 0
252+
}
253+
q := []string{"0000"}
254+
visited := map[string]bool{"0000": true}
255+
step := 0
256+
for len(q) > 0 {
257+
step++
258+
size := len(q)
259+
for i := 0; i < size; i++ {
260+
cur := q[0]
261+
q = q[1:]
262+
for j := 0; j < 4; j++ {
263+
for k := -1; k <= 1; k += 2 {
264+
next := cur[:j] + string((cur[j]-'0'+byte(k)+10)%10+'0') + cur[j+1:]
265+
if next == target {
266+
return step
267+
}
268+
if !dead[next] && !visited[next] {
269+
q = append(q, next)
270+
visited[next] = true
271+
}
272+
}
273+
}
274+
}
275+
}
276+
return -1
277+
}
278+
```
279+
239280
<!-- tabs:end -->
240281

241282
<!-- solution:end -->
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
func openLock(deadends []string, target string) int {
2+
dead := map[string]bool{}
3+
for _, s := range deadends {
4+
dead[s] = true
5+
}
6+
if dead["0000"] {
7+
return -1
8+
}
9+
if target == "0000" {
10+
return 0
11+
}
12+
q := []string{"0000"}
13+
visited := map[string]bool{"0000": true}
14+
step := 0
15+
for len(q) > 0 {
16+
step++
17+
size := len(q)
18+
for i := 0; i < size; i++ {
19+
cur := q[0]
20+
q = q[1:]
21+
for j := 0; j < 4; j++ {
22+
for k := -1; k <= 1; k += 2 {
23+
next := cur[:j] + string((cur[j]-'0'+byte(k)+10)%10+'0') + cur[j+1:]
24+
if next == target {
25+
return step
26+
}
27+
if !dead[next] && !visited[next] {
28+
q = append(q, next)
29+
visited[next] = true
30+
}
31+
}
32+
}
33+
}
34+
}
35+
return -1
36+
}

lcof2/剑指 Offer II 114. 外星文字典/README.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,68 @@ public:
287287
};
288288
```
289289
290+
#### Go
291+
292+
```go
293+
func alienOrder(words []string) string {
294+
n := len(words)
295+
if n == 0 {
296+
return ""
297+
}
298+
if n == 1 {
299+
return words[0]
300+
}
301+
inDegree := make(map[byte]int)
302+
graph := make(map[byte][]byte)
303+
for _, word := range words {
304+
for i := 0; i < len(word); i++ {
305+
inDegree[word[i]] = 0
306+
}
307+
}
308+
for i := 0; i < n-1; i++ {
309+
w1, w2 := words[i], words[i+1]
310+
minLen := len(w1)
311+
if len(w2) < minLen {
312+
minLen = len(w2)
313+
}
314+
foundDifference := false
315+
for j := 0; j < minLen; j++ {
316+
if w1[j] != w2[j] {
317+
inDegree[w2[j]]++
318+
graph[w1[j]] = append(graph[w1[j]], w2[j])
319+
foundDifference = true
320+
break
321+
}
322+
}
323+
if !foundDifference && len(w1) > len(w2) {
324+
return ""
325+
}
326+
}
327+
queue := make([]byte, 0)
328+
for k := range inDegree {
329+
if inDegree[k] == 0 {
330+
queue = append(queue, k)
331+
}
332+
}
333+
res := make([]byte, 0)
334+
for len(queue) > 0 {
335+
node := queue[0]
336+
queue = queue[1:]
337+
res = append(res, node)
338+
for _, next := range graph[node] {
339+
inDegree[next]--
340+
if inDegree[next] == 0 {
341+
queue = append(queue, next)
342+
}
343+
}
344+
}
345+
if len(res) != len(inDegree) {
346+
return ""
347+
}
348+
return string(res)
349+
}
350+
```
351+
290352
<!-- tabs:end -->
291353

292354
<!-- solution:end -->
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
func alienOrder(words []string) string {
2+
n := len(words)
3+
if n == 0 {
4+
return ""
5+
}
6+
if n == 1 {
7+
return words[0]
8+
}
9+
inDegree := make(map[byte]int)
10+
graph := make(map[byte][]byte)
11+
for _, word := range words {
12+
for i := 0; i < len(word); i++ {
13+
inDegree[word[i]] = 0
14+
}
15+
}
16+
for i := 0; i < n-1; i++ {
17+
w1, w2 := words[i], words[i+1]
18+
minLen := len(w1)
19+
if len(w2) < minLen {
20+
minLen = len(w2)
21+
}
22+
foundDifference := false
23+
for j := 0; j < minLen; j++ {
24+
if w1[j] != w2[j] {
25+
inDegree[w2[j]]++
26+
graph[w1[j]] = append(graph[w1[j]], w2[j])
27+
foundDifference = true
28+
break
29+
}
30+
}
31+
if !foundDifference && len(w1) > len(w2) {
32+
return ""
33+
}
34+
}
35+
queue := make([]byte, 0)
36+
for k := range inDegree {
37+
if inDegree[k] == 0 {
38+
queue = append(queue, k)
39+
}
40+
}
41+
res := make([]byte, 0)
42+
for len(queue) > 0 {
43+
node := queue[0]
44+
queue = queue[1:]
45+
res = append(res, node)
46+
for _, next := range graph[node] {
47+
inDegree[next]--
48+
if inDegree[next] == 0 {
49+
queue = append(queue, next)
50+
}
51+
}
52+
}
53+
if len(res) != len(inDegree) {
54+
return ""
55+
}
56+
return string(res)
57+
}

solution/0100-0199/0181.Employees Earning More Than Their Managers/README.md

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ Employee 表:
6868

6969
<!-- solution:start -->
7070

71-
### 方法一
71+
### 方法一:自连接 + 条件筛选
72+
73+
我们可以通过自连接 `Employee` 表,找出员工的工资以及其经理的工资,然后筛选出工资比经理高的员工。
7274

7375
<!-- tabs:start -->
7476

@@ -79,44 +81,22 @@ import pandas as pd
7981

8082

8183
def find_employees(employee: pd.DataFrame) -> pd.DataFrame:
82-
df = employee.merge(right=employee, how="left", left_on="managerId", right_on="id")
83-
emp = df[df["salary_x"] > df["salary_y"]]["name_x"]
84-
85-
return pd.DataFrame({"Employee": emp})
86-
```
87-
88-
#### MySQL
89-
90-
```sql
91-
SELECT Name AS Employee
92-
FROM Employee AS Curr
93-
WHERE
94-
Salary > (
95-
SELECT Salary
96-
FROM Employee
97-
WHERE Id = Curr.ManagerId
98-
);
84+
merged = employee.merge(
85+
employee, left_on="managerId", right_on="id", suffixes=("", "_manager")
86+
)
87+
result = merged[merged["salary"] > merged["salary_manager"]][["name"]]
88+
result.columns = ["Employee"]
89+
return result
9990
```
10091

101-
<!-- tabs:end -->
102-
103-
<!-- solution:end -->
104-
105-
<!-- solution:start -->
106-
107-
### 方法二
108-
109-
<!-- tabs:start -->
110-
11192
#### MySQL
11293

11394
```sql
11495
# Write your MySQL query statement below
115-
SELECT
116-
e1.name AS Employee
96+
SELECT e1.name Employee
11797
FROM
118-
Employee AS e1
119-
JOIN Employee AS e2 ON e1.managerId = e2.id
98+
Employee e1
99+
JOIN Employee e2 ON e1.managerId = e2.id
120100
WHERE e1.salary > e2.salary;
121101
```
122102

solution/0100-0199/0181.Employees Earning More Than Their Managers/README_EN.md

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ Employee table:
6868

6969
<!-- solution:start -->
7070

71-
### Solution 1
71+
### Solution 1: Self-Join + Conditional Filtering
72+
73+
We can find employees' salaries and their managers' salaries by self-joining the `Employee` table, then filter out employees whose salaries are higher than their managers' salaries.
7274

7375
<!-- tabs:start -->
7476

@@ -79,44 +81,22 @@ import pandas as pd
7981

8082

8183
def find_employees(employee: pd.DataFrame) -> pd.DataFrame:
82-
df = employee.merge(right=employee, how="left", left_on="managerId", right_on="id")
83-
emp = df[df["salary_x"] > df["salary_y"]]["name_x"]
84-
85-
return pd.DataFrame({"Employee": emp})
86-
```
87-
88-
#### MySQL
89-
90-
```sql
91-
SELECT Name AS Employee
92-
FROM Employee AS Curr
93-
WHERE
94-
Salary > (
95-
SELECT Salary
96-
FROM Employee
97-
WHERE Id = Curr.ManagerId
98-
);
84+
merged = employee.merge(
85+
employee, left_on="managerId", right_on="id", suffixes=("", "_manager")
86+
)
87+
result = merged[merged["salary"] > merged["salary_manager"]][["name"]]
88+
result.columns = ["Employee"]
89+
return result
9990
```
10091

101-
<!-- tabs:end -->
102-
103-
<!-- solution:end -->
104-
105-
<!-- solution:start -->
106-
107-
### Solution 2
108-
109-
<!-- tabs:start -->
110-
11192
#### MySQL
11293

11394
```sql
11495
# Write your MySQL query statement below
115-
SELECT
116-
e1.name AS Employee
96+
SELECT e1.name Employee
11797
FROM
118-
Employee AS e1
119-
JOIN Employee AS e2 ON e1.managerId = e2.id
98+
Employee e1
99+
JOIN Employee e2 ON e1.managerId = e2.id
120100
WHERE e1.salary > e2.salary;
121101
```
122102

solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33

44
def find_employees(employee: pd.DataFrame) -> pd.DataFrame:
5-
df = employee.merge(right=employee, how="left", left_on="managerId", right_on="id")
6-
emp = df[df["salary_x"] > df["salary_y"]]["name_x"]
7-
8-
return pd.DataFrame({"Employee": emp})
5+
merged = employee.merge(
6+
employee, left_on="managerId", right_on="id", suffixes=("", "_manager")
7+
)
8+
result = merged[merged["salary"] > merged["salary_manager"]][["name"]]
9+
result.columns = ["Employee"]
10+
return result
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
SELECT Name AS Employee
2-
FROM Employee AS Curr
3-
WHERE
4-
Salary > (
5-
SELECT Salary
6-
FROM Employee
7-
WHERE Id = Curr.ManagerId
8-
);
1+
# Write your MySQL query statement below
2+
SELECT e1.name Employee
3+
FROM
4+
Employee e1
5+
JOIN Employee e2 ON e1.managerId = e2.id
6+
WHERE e1.salary > e2.salary;

solution/0100-0199/0181.Employees Earning More Than Their Managers/Solution2.sql

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)