Skip to content

Instantly share code, notes, and snippets.

@luw2007
Last active March 14, 2019 15:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save luw2007/34ba43984d60e92b3f82dc88d65d2d23 to your computer and use it in GitHub Desktop.
Save luw2007/34ba43984d60e92b3f82dc88d65d2d23 to your computer and use it in GitHub Desktop.
google 面试题:输出连续的1、2、3、4到4个文件

有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:

A:1 2 3 4 1 2.... B:2 3 4 1 2 3.... C:3 4 1 2 3 4.... D:4 1 2 3 4 1....

流程图 看图,可以发现从A开始循环数“1,2,3,4”,遇到4则在当前文件重新开始输出,然后顺序输出。 play@google

package main
import (
"bytes"
"fmt"
"strconv"
)
const STEP, NUM = 4, 40
var (
chans [STEP]chan int // 创建生产者
files [STEP]*bytes.Buffer // 创建接受者
last, cur = 0, 0
)
func main() {
for i := range chans {
chans[i] = make(chan int)
files[i] = new(bytes.Buffer)
go func(out chan<- int, prime int) {
for {
out <- prime
}
}(chans[i], i)
}
for j := 0; j < NUM; j++ {
k := <-chans[j%STEP] + 1
files[cur].WriteString(strconv.Itoa(k))
// 当前游标如果到达最大值 则停留一次,然后继续前进
if k != STEP || cur == last {
last, cur = cur, (cur+1)%4
}
}
fmt.Print(files)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment