Skip to content

Latest commit

 

History

History
240 lines (202 loc) · 4.81 KB

File metadata and controls

240 lines (202 loc) · 4.81 KB
title subtitle date lastmod draft author authorLink description license images tags categories featuredImage featuredImagePreview hiddenFromHomePage hiddenFromSearch twemoji lightgallery ruby fraction fontawesome linkToMarkdown rssFullText toc code math mapbox share comment library seo
1195. Fizz Buzz Multithreaded
2024-02-18 16:25:00 +0800
2024-02-18 16:25:00 +0800
false
Kimi.Tsai
1195.Fizz-Buzz-Multithreaded
LeetCode
Go
Medium
Fizz Buzz Multithreaded
Concurrency
LeetCode
false
false
false
true
true
true
true
false
false
enable auto
true
true
copy maxShownLines
true
200
enable
enable
true
enable
true
css js
images

題目

You have the four functions:

printFizz that prints the word "fizz" to the console, printBuzz that prints the word "buzz" to the console, printFizzBuzz that prints the word "fizzbuzz" to the console, and printNumber that prints a given integer to the console. You are given an instance of the class FizzBuzz that has four functions: fizz, buzz, fizzbuzz and number. The same instance of FizzBuzz will be passed to four different threads:

Thread A: calls fizz() that should output the word "fizz". Thread B: calls buzz() that should output the word "buzz". Thread C: calls fizzbuzz() that should output the word "fizzbuzz". Thread D: calls number() that should only output the integers. Modify the given class to output the series [1, 2, "fizz", 4, "buzz", ...] where the ith token (1-indexed) of the series is:

"fizzbuzz" if i is divisible by 3 and 5, "fizz" if i is divisible by 3 and not 5, "buzz" if i is divisible by 5 and not 3, or i if i is not divisible by 3 or 5. Implement the FizzBuzz class:

FizzBuzz(int n) Initializes the object with the number n that represents the length of the sequence that should be printed. void fizz(printFizz) Calls printFizz to output "fizz". void buzz(printBuzz) Calls printBuzz to output "buzz". void fizzbuzz(printFizzBuzz) Calls printFizzBuzz to output "fizzbuzz". void number(printNumber) Calls printnumber to output the numbers.

Example 1:

Input: n = 15 Output: [1,2,"fizz",4,"buzz","fizz",7,8,"fizz","buzz",11,"fizz",13,14,"fizzbuzz"] Example 2:

Input: n = 5 Output: [1,2,"fizz",4,"buzz"]

Constraints:

1 <= n <= 50

題目大意

解題思路

Big O

時間複雜 : 空間複雜 :

來源

解答

https://github.com/kimi0230/LeetcodeGolang/blob/master/Leetcode/1195.Fizz-Buzz-Multithreaded/main.go

package fizzbuzzmultithreaded

import (
	"fmt"
	"sync"
)

var (
	wg = sync.WaitGroup{}
)

// 時間複雜 O(), 空間複雜 O()
func FizzBuzz(n int) {
	fb := NewFizzBuzz()

	wg.Add(4)

	go fb.fizz()
	go fb.buzz()
	go fb.fizzbuzz()
	go fb.number()

	for i := 1; i <= n; i++ {
		if i%3 == 0 && i%5 == 0 {
			fb.fizzbuzzCh <- struct{}{}
		} else if i%3 == 0 {
			fb.fizzCh <- struct{}{}
		} else if i%5 == 0 {
			fb.buzzCh <- struct{}{}
		} else {
			fb.numberCh <- i
		}
		<-fb.orderCh
	}
	fb.done <- struct{}{}
	fb.done <- struct{}{}
	fb.done <- struct{}{}
	fb.done <- struct{}{}
	wg.Wait()
}

type FizzBuzzStruct struct {
	numberCh   chan int
	fizzCh     chan struct{}
	buzzCh     chan struct{}
	fizzbuzzCh chan struct{}
	orderCh    chan struct{}
	done       chan struct{}
}

func NewFizzBuzz() *FizzBuzzStruct {
	return &FizzBuzzStruct{
		numberCh:   make(chan int),
		fizzCh:     make(chan struct{}),
		buzzCh:     make(chan struct{}),
		fizzbuzzCh: make(chan struct{}),
		orderCh:    make(chan struct{}),
		done:       make(chan struct{}, 4),
	}
}

func (fb *FizzBuzzStruct) fizz() {
	defer wg.Done()
	for {
		select {
		case <-fb.fizzCh:
			fmt.Print("fizz")
			fb.orderCh <- struct{}{}
		case <-fb.done:
			return
		}
	}
}

func (fb *FizzBuzzStruct) buzz() {
	defer wg.Done()
	for {
		select {
		case <-fb.buzzCh:
			fmt.Print("buzz")
			fb.orderCh <- struct{}{}
		case <-fb.done:
			return
		}
	}
}

func (fb *FizzBuzzStruct) fizzbuzz() {
	defer wg.Done()
	for {
		select {
		case <-fb.fizzbuzzCh:
			fmt.Print("fizzbuzz")
			fb.orderCh <- struct{}{}
		case <-fb.done:
			return
		}
	}
}

func (fb *FizzBuzzStruct) number() {
	defer wg.Done()
	for {
		select {
		case v := <-fb.numberCh:
			fmt.Print(v)
			fb.orderCh <- struct{}{}
		case <-fb.done:
			return
		}
	}
}

Benchmark