字节跳动面试算法题解析(go)
//题目描述,使用两个线程交替打印“字节跳动2022” //思路解析:使用goroutine协程,由于协程并发 //这里在每个协程添加相应管道,实现交替打印 func main() { iChan1 := make(chan bool, 1) iChan2 := make(chan bool, 1) iChan3 := make(chan bool, 2) iChan2 <- true go print1(iChan1, iChan2, iChan3) go print2(iChan1, iChan2, iChan3) //go func(){ // //}() for i := 0; i < 2; i++ { <-iChan3 } } func print1(iChan1 chan bool, iChan2 chan bool, iChan3 chan bool) { s1 := []string{ "字", "跳", "2", "2"} for _, v := range s1 { <-iChan2 fmt.Print(v) iChan1 <- true } iChan3 <- true } func print2(iChan1 chan bool, iChan2 chan bool, iChan3 chan bool) { s2 := []string{ "节", "动", "0", "2"} for _, v := range s2 { <-iChan1 fmt.Print(v) iChan2 <- true } iChan3 <- true }
//问题描述:合并多个有序数组 //Input: // [ // [1, 3, 5, 7], // [2, 4, 6], // [0, 8, 9, 10, 11] // ] //Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] /思路解析:这里使用优先队列,即创建小根堆 //时间复杂度为O(NlogK) type Node struct { row int col int val int } type NodeHeap []Node func (h NodeHeap) Len() int{ return len(h) } func (h NodeHeap) Less(i, j int) bool{ return h[i].val < h[j].val } func (h NodeHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *NodeHeap) Push(x interface{ }) { *h = append(*h, x.(Node)) } func (h *NodeHeap) Pop() interface{ } { old := *h n := len(old) x := old[n-1] *h = old[0: n-1] return x } func mergekSortedArrays (arrays [][]int) []int { // write your code here //var priorityQueue interface h := &NodeHeap{ } heap.Init(h) ans := []int{ } for i := 0; i < len(arrays); i++{ node := &Node{ row: i, col: 0, val: arrays[i][0], } heap.Push(h, *node) } //fmt.Println(h) for h.Len() != 0{ n := heap.Pop(h) //返回的一个接口 ans = append(ans, n.(Node).val) //适用类型断言将接口转换为Node类型 if n.(Node).col+1 < len(arrays[n.(Node).row]) { //定义新添加的节点 newNode := &Node{ row: n.(Node).row, col: n.(Node).col+1, val: arrays[n.(Node).row][n.(Node).col+1], } heap.Push(h,*newNode) } } return ans } func main(){ arrays := [][]int{ { 1,3,5,7},{ 2,4,6},{ 0,8,9,10,11}} fmt.Println(mergekSortedArrays(arrays)) }
上一篇:
IDEA上Java项目控制台中文乱码