LeetCode 1115. Print FooBar Alternately Solution in Java, C++ & Python | Explanation + Code

CoderIndeed
0
1115. Print FooBar Alternately

Description

Suppose you are given the following code:

class FooBar {
  public void foo() {
    for (int i = 0; i < n; i++) {
      print("foo");
    }
  }

  public void bar() {
    for (int i = 0; i < n; i++) {
      print("bar");
    }
  }
}

The same instance of FooBar will be passed to two different threads:

  • thread A will call foo(), while
  • thread B will call bar().

Modify the given program to output "foobar" n times.

 

Example 1:

Input: n = 1
Output: "foobar"
Explanation: There are two threads being fired asynchronously. One of them calls foo(), while the other calls bar().
"foobar" is being output 1 time.

Example 2:

Input: n = 2
Output: "foobarfoobar"
Explanation: "foobar" is being output 2 times.

 

Constraints:

  • 1 <= n <= 1000

Solutions

Solution 1: Multithreading + Semaphore

We use two semaphores f and b to control the execution order of the two threads, where f is initially set to 1 and b is set to 0, indicating that thread A executes first.

When thread A executes, it first performs the acquire operation on f, which changes the value of f to 0. Thread A then gains the right to use f and can execute the foo function. After that, it performs the release operation on b, changing the value of b to 1. This allows thread B to gain the right to use b and execute the bar function.

When thread B executes, it first performs the acquire operation on b, which changes the value of b to 0. Thread B then gains the right to use b and can execute the bar function. After that, it performs the release operation on f, changing the value of f to 1. This allows thread A to gain the right to use f and execute the foo function.

Therefore, we only need to loop n times, each time executing the foo and bar functions, first performing the acquire operation, and then the release operation.

The time complexity is O(n), and the space complexity is O(1).

PythonJavaC++
from threading import Semaphore class FooBar: def __init__(self, n): self.n = n self.f = Semaphore(1) self.b = Semaphore(0) def foo(self, printFoo: "Callable[[], None]") -> None: for _ in range(self.n): self.f.acquire() # printFoo() outputs "foo". Do not change or remove this line. printFoo() self.b.release() def bar(self, printBar: "Callable[[], None]") -> None: for _ in range(self.n): self.b.acquire() # printBar() outputs "bar". Do not change or remove this line. printBar() self.f.release()(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !