LeetCode 1116. Print Zero Even Odd
原题链接在这里:https://leetcode.com/problems/print-zero-even-odd/
题目:
You have a function printNumber that can be called with an integer parameter and prints it to the console.
- For example, calling
printNumber(7)prints7to the console.
You are given an instance of the class ZeroEvenOdd that has three functions: zero, even, and odd. The same instance of ZeroEvenOdd will be passed to three different threads:
- Thread A: calls
zero()that should only output0's. - Thread B: calls
even()that should only output even numbers. - Thread C: calls
odd()that should only output odd numbers.
Modify the given class to output the series "010203040506..." where the length of the series must be 2n.
Implement the ZeroEvenOdd class:
ZeroEvenOdd(int n)Initializes the object with the numbernthat represents the numbers that should be printed.void zero(printNumber)CallsprintNumberto output one zero.void even(printNumber)CallsprintNumberto output one even number.void odd(printNumber)CallsprintNumberto output one odd number.
Example 1:
Input: n = 2 Output: "0102" Explanation: There are three threads being fired asynchronously. One of them calls zero(), the other calls even(), and the last one calls odd(). "0102" is the correct output.
Example 2:
Input: n = 5 Output: "0102030405"
Constraints:
1 <= n <= 1000
题解:
Use Semaphore. Semaphore(0) means each acquire needs to wait for release.
Semaphore(1) means first acquire could get it, but following acquire needs to wait for release.
Time Complexity: O(1).
Space: O(1).
AC Java:
1 class ZeroEvenOdd { 2 private int n; 3 private Semaphore zeroSem; 4 private Semaphore evenSem; 5 private Semaphore oddSem; 6 7 public ZeroEvenOdd(int n) { 8 this.n = n; 9 zeroSem = new Semaphore(1); 10 evenSem = new Semaphore(0); 11 oddSem = new Semaphore(0); 12 } 13 14 // printNumber.accept(x) outputs "x", where x is an integer. 15 public void zero(IntConsumer printNumber) throws InterruptedException { 16 for(int i = 1; i <= n; i++){ 17 zeroSem.acquire(); 18 printNumber.accept(0); 19 if(i % 2 == 0){ 20 evenSem.release(); 21 }else{ 22 oddSem.release(); 23 } 24 } 25 } 26 27 public void even(IntConsumer printNumber) throws InterruptedException { 28 for(int i = 2; i <= n; i += 2){ 29 evenSem.acquire(); 30 printNumber.accept(i); 31 zeroSem.release(); 32 } 33 } 34 35 public void odd(IntConsumer printNumber) throws InterruptedException { 36 for(int i = 1; i <= n; i += 2){ 37 oddSem.acquire(); 38 printNumber.accept(i); 39 zeroSem.release(); 40 } 41 } 42 }
浙公网安备 33010602011771号