Formatted question description: https://leetcode.ca/all/1116.html

# 1116. Print Zero Even Odd

## Level

Medium

## Description

Suppose you are given the following code:

```
class ZeroEvenOdd {
public ZeroEvenOdd(int n) { ... } // constructor
public void zero(printNumber) { ... } // only output 0's
public void even(printNumber) { ... } // only output even numbers
public void odd(printNumber) { ... } // only output odd numbers
}
```

The same instance of `ZeroEvenOdd`

will be passed to three different threads:

- Thread A will call
`zero()`

which should only output 0’s. - Thread B will call
`even()`

which should only ouput even numbers. - Thread C will call
`odd()`

which should only output odd numbers.

Each of the threads is given a `printNumber`

method to output an integer. Modify the given program to output the series `010203040506...`

where the length of the series must be 2*n*.

**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”

## Solution

This problem can be solved using semaphores. In the class, create three semaphores `semaphoreZero`

, `semaphoreOdd`

and `semaphoreEven`

for methods `zero()`

, `odd()`

and `even()`

respectively. Initially, `semaphoreZero`

has 1 permit, while `semaphoreOdd`

and `semaphoreEven`

has 0 permits.

For each method `zero()`

, `odd()`

and `even()`

, in the loop, there are three steps. The first step is to acquire a permit from the current semaphore. The second step is to call the `printNumber.accept(x)`

method for the current number. The third step is to release a permit back to the next semaphore.