Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 93e63be

Browse files
committed
feat: add solutions to lc problem: No.1116
No.1116.Print Zero Even Odd
1 parent 7ef911b commit 93e63be

File tree

4 files changed

+287
-19
lines changed

4 files changed

+287
-19
lines changed

‎solution/1100-1199/1116.Print Zero Even Odd/README.md‎

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,148 @@
6060

6161
<!-- 这里可写通用的实现逻辑 -->
6262

63+
**方法一:多线程 + 信号量**
64+
65+
我们用三个信号量 $z,ドル $e,ドル $o$ 来控制三个线程的执行顺序,其中 $z$ 的初始值为 1ドル,ドル$e$ 和 $o$ 的初始值为 0ドル$。
66+
67+
- 信号量 $x$ 控制 `zero` 函数的执行,当 $z$ 信号量的值为 1ドル$ 时,`zero` 函数可以执行,执行完毕后将 $z$ 信号量的值设为 0ドル,ドル并将 $e$ 信号量的值设为 1ドル$ 或 $o$ 信号量的值设为 1ドル,ドル具体取决于下一次需要执行的是 `even` 函数还是 `odd` 函数。
68+
- 信号量 $e$ 控制 `even` 函数的执行,当 $e$ 信号量的值为 1ドル$ 时,`even` 函数可以执行,执行完毕后将 $z$ 信号量的值设为 1ドル,ドル并将 $e$ 信号量的值设为 0ドル$。
69+
- 信号量 $o$ 控制 `odd` 函数的执行,当 $o$ 信号量的值为 1ドル$ 时,`odd` 函数可以执行,执行完毕后将 $z$ 信号量的值设为 1ドル,ドル并将 $o$ 信号量的值设为 0ドル$。
70+
71+
时间复杂度 $O(n),ドル空间复杂度 $O(1)$。
72+
6373
<!-- tabs:start -->
6474

6575
### **Python3**
6676

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

6979
```python
70-
80+
from threading import Semaphore
81+
82+
class ZeroEvenOdd:
83+
def __init__(self, n):
84+
self.n = n
85+
self.z = Semaphore(1)
86+
self.e = Semaphore(0)
87+
self.o = Semaphore(0)
88+
89+
# printNumber(x) outputs "x", where x is an integer.
90+
def zero(self, printNumber: 'Callable[[int], None]') -> None:
91+
for i in range(self.n):
92+
self.z.acquire()
93+
printNumber(0)
94+
if i % 2 == 0:
95+
self.o.release()
96+
else:
97+
self.e.release()
98+
99+
def even(self, printNumber: 'Callable[[int], None]') -> None:
100+
for i in range(2, self.n + 1, 2):
101+
self.e.acquire()
102+
printNumber(i)
103+
self.z.release()
104+
105+
def odd(self, printNumber: 'Callable[[int], None]') -> None:
106+
for i in range(1, self.n + 1, 2):
107+
self.o.acquire()
108+
printNumber(i)
109+
self.z.release()
71110
```
72111

73112
### **Java**
74113

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

77116
```java
117+
class ZeroEvenOdd {
118+
private int n;
119+
private Semaphore z = new Semaphore(1);
120+
private Semaphore e = new Semaphore(0);
121+
private Semaphore o = new Semaphore(0);
122+
123+
public ZeroEvenOdd(int n) {
124+
this.n = n;
125+
}
126+
127+
// printNumber.accept(x) outputs "x", where x is an integer.
128+
public void zero(IntConsumer printNumber) throws InterruptedException {
129+
for (int i = 0; i < n; ++i) {
130+
z.acquire(1);
131+
printNumber.accept(0);
132+
if (i % 2 == 0) {
133+
o.release(1);
134+
} else {
135+
e.release(1);
136+
}
137+
}
138+
}
139+
140+
public void even(IntConsumer printNumber) throws InterruptedException {
141+
for (int i = 2; i <= n; i += 2) {
142+
e.acquire(1);
143+
printNumber.accept(i);
144+
z.release(1);
145+
}
146+
}
147+
148+
public void odd(IntConsumer printNumber) throws InterruptedException {
149+
for (int i = 1; i <= n; i += 2) {
150+
o.acquire(1);
151+
printNumber.accept(i);
152+
z.release(1);
153+
}
154+
}
155+
}
156+
```
78157

158+
### **C++**
159+
160+
```cpp
161+
#include <semaphore.h>
162+
163+
class ZeroEvenOdd {
164+
private:
165+
int n;
166+
sem_t z, e, o;
167+
168+
public:
169+
ZeroEvenOdd(int n) {
170+
this->n = n;
171+
sem_init(&z, 0, 1);
172+
sem_init(&e, 0, 0);
173+
sem_init(&o, 0, 0);
174+
}
175+
176+
// printNumber(x) outputs "x", where x is an integer.
177+
void zero(function<void(int)> printNumber) {
178+
for (int i = 0; i < n; ++i) {
179+
sem_wait(&z);
180+
printNumber(0);
181+
if (i % 2 == 0) {
182+
sem_post(&o);
183+
} else {
184+
sem_post(&e);
185+
}
186+
}
187+
}
188+
189+
void even(function<void(int)> printNumber) {
190+
for (int i = 2; i <= n; i += 2) {
191+
sem_wait(&e);
192+
printNumber(i);
193+
sem_post(&z);
194+
}
195+
}
196+
197+
void odd(function<void(int)> printNumber) {
198+
for (int i = 1; i <= n; i += 2) {
199+
sem_wait(&o);
200+
printNumber(i);
201+
sem_post(&z);
202+
}
203+
}
204+
};
79205
```
80206
81207
### **...**

‎solution/1100-1199/1116.Print Zero Even Odd/README_EN.md‎

Lines changed: 117 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,129 @@ One of them calls zero(), the other calls even(), and the last one calls odd().
6161
### **Python3**
6262

6363
```python
64-
64+
from threading import Semaphore
65+
66+
class ZeroEvenOdd:
67+
def __init__(self, n):
68+
self.n = n
69+
self.z = Semaphore(1)
70+
self.e = Semaphore(0)
71+
self.o = Semaphore(0)
72+
73+
# printNumber(x) outputs "x", where x is an integer.
74+
def zero(self, printNumber: 'Callable[[int], None]') -> None:
75+
for i in range(self.n):
76+
self.z.acquire()
77+
printNumber(0)
78+
if i % 2 == 0:
79+
self.o.release()
80+
else:
81+
self.e.release()
82+
83+
def even(self, printNumber: 'Callable[[int], None]') -> None:
84+
for i in range(2, self.n + 1, 2):
85+
self.e.acquire()
86+
printNumber(i)
87+
self.z.release()
88+
89+
def odd(self, printNumber: 'Callable[[int], None]') -> None:
90+
for i in range(1, self.n + 1, 2):
91+
self.o.acquire()
92+
printNumber(i)
93+
self.z.release()
6594
```
6695

6796
### **Java**
6897

6998
```java
99+
class ZeroEvenOdd {
100+
private int n;
101+
private Semaphore z = new Semaphore(1);
102+
private Semaphore e = new Semaphore(0);
103+
private Semaphore o = new Semaphore(0);
104+
105+
public ZeroEvenOdd(int n) {
106+
this.n = n;
107+
}
108+
109+
// printNumber.accept(x) outputs "x", where x is an integer.
110+
public void zero(IntConsumer printNumber) throws InterruptedException {
111+
for (int i = 0; i < n; ++i) {
112+
z.acquire(1);
113+
printNumber.accept(0);
114+
if (i % 2 == 0) {
115+
o.release(1);
116+
} else {
117+
e.release(1);
118+
}
119+
}
120+
}
121+
122+
public void even(IntConsumer printNumber) throws InterruptedException {
123+
for (int i = 2; i <= n; i += 2) {
124+
e.acquire(1);
125+
printNumber.accept(i);
126+
z.release(1);
127+
}
128+
}
129+
130+
public void odd(IntConsumer printNumber) throws InterruptedException {
131+
for (int i = 1; i <= n; i += 2) {
132+
o.acquire(1);
133+
printNumber.accept(i);
134+
z.release(1);
135+
}
136+
}
137+
}
138+
```
70139

140+
### **C++**
141+
142+
```cpp
143+
#include <semaphore.h>
144+
145+
class ZeroEvenOdd {
146+
private:
147+
int n;
148+
sem_t z, e, o;
149+
150+
public:
151+
ZeroEvenOdd(int n) {
152+
this->n = n;
153+
sem_init(&z, 0, 1);
154+
sem_init(&e, 0, 0);
155+
sem_init(&o, 0, 0);
156+
}
157+
158+
// printNumber(x) outputs "x", where x is an integer.
159+
void zero(function<void(int)> printNumber) {
160+
for (int i = 0; i < n; ++i) {
161+
sem_wait(&z);
162+
printNumber(0);
163+
if (i % 2 == 0) {
164+
sem_post(&o);
165+
} else {
166+
sem_post(&e);
167+
}
168+
}
169+
}
170+
171+
void even(function<void(int)> printNumber) {
172+
for (int i = 2; i <= n; i += 2) {
173+
sem_wait(&e);
174+
printNumber(i);
175+
sem_post(&z);
176+
}
177+
}
178+
179+
void odd(function<void(int)> printNumber) {
180+
for (int i = 1; i <= n; i += 2) {
181+
sem_wait(&o);
182+
printNumber(i);
183+
sem_post(&z);
184+
}
185+
}
186+
};
71187
```
72188
73189
### **...**
Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,39 @@
11
class ZeroEvenOdd {
2-
3-
private Semaphore zero_S;
4-
private Semaphore odd_S;
5-
private Semaphore even_S;
62
private int n;
7-
3+
private Semaphore z = new Semaphore(1);
4+
private Semaphore e = new Semaphore(0);
5+
private Semaphore o = new Semaphore(0);
6+
87
public ZeroEvenOdd(int n) {
98
this.n = n;
10-
this.zero_S = new Semaphore(1);
11-
this.odd_S = new Semaphore(0);
12-
this.even_S = new Semaphore(0);
139
}
1410

1511
// printNumber.accept(x) outputs "x", where x is an integer.
1612
public void zero(IntConsumer printNumber) throws InterruptedException {
17-
for (int i = 1; i <= n; i++) {
18-
zero_S.acquire(1);
13+
for (int i = 0; i < n; ++i) {
14+
z.acquire(1);
1915
printNumber.accept(0);
20-
if ((i & 1) == 0) {
21-
odd_S.release(1);
16+
if (i % 2 == 0) {
17+
o.release(1);
2218
} else {
23-
even_S.release(1);
19+
e.release(1);
2420
}
2521
}
2622
}
2723

2824
public void even(IntConsumer printNumber) throws InterruptedException {
2925
for (int i = 2; i <= n; i += 2) {
30-
even_S.acquire(1);
26+
e.acquire(1);
3127
printNumber.accept(i);
32-
zero_S.release(1);
28+
z.release(1);
3329
}
3430
}
3531

3632
public void odd(IntConsumer printNumber) throws InterruptedException {
3733
for (int i = 1; i <= n; i += 2) {
38-
odd_S.acquire(1);
34+
o.acquire(1);
3935
printNumber.accept(i);
40-
zero_S.release(1);
36+
z.release(1);
4137
}
4238
}
4339
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from threading import Semaphore
2+
3+
class ZeroEvenOdd:
4+
def __init__(self, n):
5+
self.n = n
6+
self.z = Semaphore(1)
7+
self.e = Semaphore(0)
8+
self.o = Semaphore(0)
9+
10+
# printNumber(x) outputs "x", where x is an integer.
11+
def zero(self, printNumber: 'Callable[[int], None]') -> None:
12+
for i in range(self.n):
13+
self.z.acquire()
14+
printNumber(0)
15+
if i % 2 == 0:
16+
self.o.release()
17+
else:
18+
self.e.release()
19+
20+
def even(self, printNumber: 'Callable[[int], None]') -> None:
21+
for i in range(2, self.n + 1, 2):
22+
self.e.acquire()
23+
printNumber(i)
24+
self.z.release()
25+
26+
def odd(self, printNumber: 'Callable[[int], None]') -> None:
27+
for i in range(1, self.n + 1, 2):
28+
self.o.acquire()
29+
printNumber(i)
30+
self.z.release()

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /