Skip to content

Commit be8cdef

Browse files
author
王鹏
committed
feat(MEDIUM): add _1116_ZeroEvenOdd
1 parent bc10ce6 commit be8cdef

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package pp.arithmetic.leetcode;
2+
3+
import java.util.concurrent.Semaphore;
4+
import java.util.function.IntConsumer;
5+
6+
/**
7+
* Created by wangpeng on 2020-07-09.
8+
* 1116. 打印零与奇偶数
9+
* <p>
10+
* 假设有这么一个类:
11+
* <p>
12+
* class ZeroEvenOdd {
13+
*   public ZeroEvenOdd(int n) { ... }  // 构造函数
14+
* public void zero(printNumber) { ... } // 仅打印出 0
15+
* public void even(printNumber) { ... } // 仅打印出 偶数
16+
* public void odd(printNumber) { ... } // 仅打印出 奇数
17+
* }
18+
* 相同的一个 ZeroEvenOdd 类实例将会传递给三个不同的线程:
19+
* <p>
20+
* 线程 A 将调用 zero(),它只输出 0 。
21+
* 线程 B 将调用 even(),它只输出偶数。
22+
* 线程 C 将调用 odd(),它只输出奇数。
23+
* 每个线程都有一个 printNumber 方法来输出一个整数。请修改给出的代码以输出整数序列 010203040506... ,其中序列的长度必须为 2n。
24+
* <p>
25+
*  
26+
* <p>
27+
* 示例 1:
28+
* <p>
29+
* 输入:n = 2
30+
* 输出:"0102"
31+
* 说明:三条线程异步执行,其中一个调用 zero(),另一个线程调用 even(),最后一个线程调用odd()。正确的输出为 "0102"。
32+
* 示例 2:
33+
* <p>
34+
* 输入:n = 5
35+
* 输出:"0102030405"
36+
* <p>
37+
* 来源:力扣(LeetCode)
38+
* 链接:https://leetcode-cn.com/problems/print-zero-even-odd
39+
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
40+
*/
41+
public class _1116_ZeroEvenOdd {
42+
43+
public static void main(String[] args) {
44+
ZeroEvenOdd zeroEvenOdd = new ZeroEvenOdd(5);
45+
IntConsumer printNumber = new IntConsumer() {
46+
@Override
47+
public void accept(int value) {
48+
System.out.println(value);
49+
}
50+
};
51+
new Thread(){
52+
@Override
53+
public void run() {
54+
super.run();
55+
try {
56+
zeroEvenOdd.zero(printNumber);
57+
} catch (InterruptedException e) {
58+
e.printStackTrace();
59+
}
60+
}
61+
}.start();
62+
new Thread(){
63+
@Override
64+
public void run() {
65+
super.run();
66+
try {
67+
zeroEvenOdd.even(printNumber);
68+
} catch (InterruptedException e) {
69+
e.printStackTrace();
70+
}
71+
}
72+
}.start();
73+
new Thread(){
74+
@Override
75+
public void run() {
76+
super.run();
77+
try {
78+
zeroEvenOdd.odd(printNumber);
79+
} catch (InterruptedException e) {
80+
e.printStackTrace();
81+
}
82+
}
83+
}.start();
84+
}
85+
86+
static class ZeroEvenOdd {
87+
private int n;
88+
private Semaphore zeroSe = new Semaphore(1);
89+
private Semaphore evenSe = new Semaphore(0);
90+
private Semaphore oddSe = new Semaphore(0);
91+
92+
public ZeroEvenOdd(int n) {
93+
this.n = n;
94+
}
95+
96+
// printNumber.accept(x) outputs "x", where x is an integer.
97+
public void zero(IntConsumer printNumber) throws InterruptedException {
98+
for (int i = 0; i < n; i++) {
99+
zeroSe.acquire();
100+
printNumber.accept(0);
101+
if (i % 2 == 0) {
102+
evenSe.release();
103+
} else {
104+
oddSe.release();
105+
}
106+
}
107+
}
108+
109+
public void even(IntConsumer printNumber) throws InterruptedException {
110+
for (int i = 1; i <= n; i+=2) {
111+
evenSe.acquire();
112+
printNumber.accept(i);
113+
zeroSe.release();
114+
}
115+
}
116+
117+
public void odd(IntConsumer printNumber) throws InterruptedException {
118+
for (int i = 2; i <= n; i+=2) {
119+
oddSe.acquire();
120+
printNumber.accept(i);
121+
zeroSe.release();
122+
}
123+
}
124+
}
125+
}

0 commit comments

Comments
 (0)