Skip to content

Commit db2e68b

Browse files
committed
feat: add solutions to lc problem: No.1117
No.1117.Building H2O
1 parent 10ad56a commit db2e68b

File tree

5 files changed

+202
-22
lines changed

5 files changed

+202
-22
lines changed

solution/1100-1199/1117.Building H2O/README.md

+79-1
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,93 @@
6666
<!-- 这里可写当前语言的特殊实现逻辑 -->
6767

6868
```python
69-
69+
from threading import Semaphore
70+
71+
72+
class H2O:
73+
def __init__(self):
74+
self.h = Semaphore(2)
75+
self.o = Semaphore(0)
76+
77+
def hydrogen(self, releaseHydrogen: "Callable[[], None]") -> None:
78+
self.h.acquire()
79+
# releaseHydrogen() outputs "H". Do not change or remove this line.
80+
releaseHydrogen()
81+
if self.h._value == 0:
82+
self.o.release()
83+
84+
def oxygen(self, releaseOxygen: "Callable[[], None]") -> None:
85+
self.o.acquire()
86+
# releaseOxygen() outputs "O". Do not change or remove this line.
87+
releaseOxygen()
88+
self.h.release(2)
7089
```
7190

7291
### **Java**
7392

7493
<!-- 这里可写当前语言的特殊实现逻辑 -->
7594

7695
```java
96+
class H2O {
97+
private Semaphore h = new Semaphore(2);
98+
private Semaphore o = new Semaphore(0);
99+
100+
public H2O() {
101+
102+
}
103+
104+
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
105+
h.acquire();
106+
// releaseHydrogen.run() outputs "H". Do not change or remove this line.
107+
releaseHydrogen.run();
108+
o.release();
109+
}
110+
111+
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
112+
o.acquire(2);
113+
// releaseOxygen.run() outputs "O". Do not change or remove this line.
114+
releaseOxygen.run();
115+
h.release(2);
116+
}
117+
}
118+
```
77119

120+
### **C++**
121+
122+
```cpp
123+
#include <semaphore.h>
124+
125+
class H2O {
126+
private:
127+
sem_t h, o;
128+
int st;
129+
130+
public:
131+
H2O() {
132+
sem_init(&h, 0, 2);
133+
sem_init(&o, 0, 0);
134+
st = 0;
135+
}
136+
137+
void hydrogen(function<void()> releaseHydrogen) {
138+
sem_wait(&h);
139+
// releaseHydrogen() outputs "H". Do not change or remove this line.
140+
releaseHydrogen();
141+
++st;
142+
if (st == 2) {
143+
sem_post(&o);
144+
}
145+
}
146+
147+
void oxygen(function<void()> releaseOxygen) {
148+
sem_wait(&o);
149+
// releaseOxygen() outputs "O". Do not change or remove this line.
150+
releaseOxygen();
151+
st = 0;
152+
sem_post(&h);
153+
sem_post(&h);
154+
}
155+
};
78156
```
79157
80158
### **...**

solution/1100-1199/1117.Building H2O/README_EN.md

+79-1
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,91 @@
5454
### **Python3**
5555

5656
```python
57-
57+
from threading import Semaphore
58+
59+
60+
class H2O:
61+
def __init__(self):
62+
self.h = Semaphore(2)
63+
self.o = Semaphore(0)
64+
65+
def hydrogen(self, releaseHydrogen: "Callable[[], None]") -> None:
66+
self.h.acquire()
67+
# releaseHydrogen() outputs "H". Do not change or remove this line.
68+
releaseHydrogen()
69+
if self.h._value == 0:
70+
self.o.release()
71+
72+
def oxygen(self, releaseOxygen: "Callable[[], None]") -> None:
73+
self.o.acquire()
74+
# releaseOxygen() outputs "O". Do not change or remove this line.
75+
releaseOxygen()
76+
self.h.release(2)
5877
```
5978

6079
### **Java**
6180

6281
```java
82+
class H2O {
83+
private Semaphore h = new Semaphore(2);
84+
private Semaphore o = new Semaphore(0);
85+
86+
public H2O() {
87+
88+
}
89+
90+
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
91+
h.acquire();
92+
// releaseHydrogen.run() outputs "H". Do not change or remove this line.
93+
releaseHydrogen.run();
94+
o.release();
95+
}
96+
97+
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
98+
o.acquire(2);
99+
// releaseOxygen.run() outputs "O". Do not change or remove this line.
100+
releaseOxygen.run();
101+
h.release(2);
102+
}
103+
}
104+
```
63105

106+
### **C++**
107+
108+
```cpp
109+
#include <semaphore.h>
110+
111+
class H2O {
112+
private:
113+
sem_t h, o;
114+
int st;
115+
116+
public:
117+
H2O() {
118+
sem_init(&h, 0, 2);
119+
sem_init(&o, 0, 0);
120+
st = 0;
121+
}
122+
123+
void hydrogen(function<void()> releaseHydrogen) {
124+
sem_wait(&h);
125+
// releaseHydrogen() outputs "H". Do not change or remove this line.
126+
releaseHydrogen();
127+
++st;
128+
if (st == 2) {
129+
sem_post(&o);
130+
}
131+
}
132+
133+
void oxygen(function<void()> releaseOxygen) {
134+
sem_wait(&o);
135+
// releaseOxygen() outputs "O". Do not change or remove this line.
136+
releaseOxygen();
137+
st = 0;
138+
sem_post(&h);
139+
sem_post(&h);
140+
}
141+
};
64142
```
65143
66144
### **...**
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,33 @@
1+
#include <semaphore.h>
2+
13
class H2O {
24
private:
3-
int n_h;
4-
mutex m_h, m_o;
5+
sem_t h, o;
6+
int st;
57

68
public:
79
H2O() {
8-
m_o.lock();
9-
n_h = 2;
10+
sem_init(&h, 0, 2);
11+
sem_init(&o, 0, 0);
12+
st = 0;
1013
}
1114

1215
void hydrogen(function<void()> releaseHydrogen) {
13-
m_h.lock();
16+
sem_wait(&h);
17+
// releaseHydrogen() outputs "H". Do not change or remove this line.
1418
releaseHydrogen();
15-
n_h--;
16-
if (n_h > 0)
17-
m_h.unlock();
18-
else
19-
m_o.unlock();
19+
++st;
20+
if (st == 2) {
21+
sem_post(&o);
22+
}
2023
}
2124

2225
void oxygen(function<void()> releaseOxygen) {
23-
m_o.lock();
26+
sem_wait(&o);
27+
// releaseOxygen() outputs "O". Do not change or remove this line.
2428
releaseOxygen();
25-
n_h = 2;
26-
m_h.unlock();
29+
st = 0;
30+
sem_post(&h);
31+
sem_post(&h);
2732
}
2833
};
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
class H2O {
2-
32
private Semaphore h = new Semaphore(2);
43
private Semaphore o = new Semaphore(0);
4+
55
public H2O() {
6+
67
}
78

89
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
9-
10+
h.acquire();
1011
// releaseHydrogen.run() outputs "H". Do not change or remove this line.
11-
h.acquire();
1212
releaseHydrogen.run();
1313
o.release();
1414
}
1515

1616
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
17-
18-
// releaseOxygen.run() outputs "O". Do not change or remove this line.
1917
o.acquire(2);
20-
releaseOxygen.run();
18+
// releaseOxygen.run() outputs "O". Do not change or remove this line.
19+
releaseOxygen.run();
2120
h.release(2);
2221
}
23-
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from threading import Semaphore
2+
3+
4+
class H2O:
5+
def __init__(self):
6+
self.h = Semaphore(2)
7+
self.o = Semaphore(0)
8+
9+
def hydrogen(self, releaseHydrogen: "Callable[[], None]") -> None:
10+
self.h.acquire()
11+
# releaseHydrogen() outputs "H". Do not change or remove this line.
12+
releaseHydrogen()
13+
if self.h._value == 0:
14+
self.o.release()
15+
16+
def oxygen(self, releaseOxygen: "Callable[[], None]") -> None:
17+
self.o.acquire()
18+
# releaseOxygen() outputs "O". Do not change or remove this line.
19+
releaseOxygen()
20+
self.h.release(2)

0 commit comments

Comments
 (0)