LeetCode: Print Zero Even Odd Posted on July 22, 2019July 26, 2020 by braindenny Print Zero Even Odd Similar Problems: CheatSheet: Leetcode For Code Interview CheatSheet: Common Code Problems & Follow-ups Tag: #concurrency 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 thread 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 2n. 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" Github: code.dennyzhang.com Credits To: leetcode.com Leave me comments, if you have better ways to solve. Solution: ## https://code.dennyzhang.com/print-zero-even-odd ## Basic Ideas: Semaphore ## Complexity: Time O(1), Space O(1) from threading import Semaphore class ZeroEvenOdd: def __init__(self, n): self.n = n self.z = Semaphore(0) self.e = Semaphore(0) self.o = Semaphore(0) self.e.acquire() self.o.acquire() # printNumber(x) outputs "x", where x is an integer. def zero(self, printNumber: 'Callable[[int], None]') -> None: for x in range(0, n): self.z.acquire() print(0) if x%2 == 1: self.o.release() else: self.e.release() def even(self, printNumber: 'Callable[[int], None]') -> None: for x in range(1, n+1): if x%2 == 0: self.e.acquire() print(x) self.z.release() def odd(self, printNumber: 'Callable[[int], None]') -> None: for x in range(1, n+1): if x%2 == 1: self.o.acquire() print(x) self.z.release() Post Views: 0