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) prints 7 to the console.

You are given an instance of the class ZeroEvenOdd that has three functions: zeroeven, and odd. The same instance of ZeroEvenOdd will be passed to three different threads:

  • Thread A: calls zero() that should only output 0'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 number n that represents the numbers that should be printed.
  • void zero(printNumber) Calls printNumber to output one zero.
  • void even(printNumber) Calls printNumber to output one even number.
  • void odd(printNumber) Calls printNumber to 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 }

类似Fizz Buzz Multithreaded.

posted @ 2022-10-14 09:54  Dylan_Java_NYC  阅读(56)  评论(0编辑  收藏  举报