在准备 Golang 高级面试时,通常会涉及到多种关键领域。本文将涵盖各个领域的具体问题示例和实现代码。
数据结构与算法
实现堆、链表、栈、队列、哈希表
1.最小堆:
最小堆是一种完全二叉树,树中每个节点的值都小于等于其子节点的值。常用于实现优先队列。
package mainimport ("fmt"
)type MinHeap struct {data []int
}func (h *MinHeap) Insert(val int) {h.data = append(h.data, val)h.upHeapify(len(h.data) - 1)
}func (h *MinHeap) upHeapify(idx int) {for idx > 0 {parent := (idx - 1) / 2if h.data[parent] <= h.data[idx] {break}h.data[parent], h.data[idx] = h.data[idx], h.data[parent]idx = parent}
}func (h *MinHeap) RemoveMin() int {if len(h.data) == 0 {return -1 // or panic, depending on your use case}min := h.data[0]h.data[0] = h.data[len(h.data)-1]h.data = h.data[:len(h.data)-1]h.downHeapify(0)return min
}func (h *MinHeap) downHeapify(idx int) {lastIdx := len(h.data) - 1for {child1 := 2*idx + 1child2 := 2*idx + 2if child1 > lastIdx {break}minChild := child1if child2 <= lastIdx && h.data[child2] < h.data[child1] {minChild = child2}if h.data[idx] <= h.data[minChild] {break}h.data[idx], h.data[minChild] = h.data[minChild], h.data[idx]idx = minChild}
}func main() {h := &MinHeap{}h.Insert(3)h.Insert(1)h.Insert(6)h.Insert(5)h.Insert(2)h.Insert(4)fmt.Println(h.RemoveMin()) // 1fmt.Println(h.RemoveMin()) // 2fmt.Println(h.RemoveMin()) // 3fmt.Println(h.RemoveMin()) // 4fmt.Println(h.RemoveMin()) // 5fmt.Println(h.RemoveMin()) // 6
}
2.单向链表:
单向链表是一种线性数据结构,其中每个元素都是一个节点,节点包含数据和指向下一个节点的指针。
package mainimport ("fmt"
)type ListNode struct {Val intNext *ListNode
}func (l *ListNode) InsertAfter(newNode *ListNode) {newNode.Next = l.Nextl.Next = newNode
}func main() {head := &ListNode{Val: 1}head.InsertAfter(&ListNode{Val: 2})head.InsertAfter(&ListNode{Val: 3})for node := head; node != nil; node = node.Next {fmt.Println(node.Val)}
}
3.栈:
栈是