Go杂谈
这里记录一下个人用Go刷题来学习Go语法的一些心得。
Go-String
Go 的字符串本身就是由单个字节连接起来的,因此遍历的时候就是字节byte
因此做题时一般把res声明为字节切片,用append添加等操作,最后再转成stringres = []byte {}
Go-map,unordered_map
Go里面好像没有unordered_map,先用mapmp = map[string]int {} // key string, value int
max 和 min都要自己写 = =
下面是支持int 和 string的模板// int写法 func min(a int, b int) int {if a > b {return b}; return a} func max(a int, b int) int {if a < b {return b}; return a} // 模板写法,支持int | string func min[T int | string] (a, b T) T {if a > b {return b}; return a} func max[T int | string] (a, b T) T {if a < b {return b}; return a}
string 转 int
cnt, _ := strconv.Atoi(str)
sort和二分搜索
nums := []int {1, 5, 4, 2, 3} sort.Ints(nums) j := sort.SearchInts(arr, target) // 直接返回下标
append头插和尾插
arr := make([]int, n) const INF = 0x3f3f3f3f; arr = append([]int{0}, arr...) // 头插一个0 arr = append(arr, INF) // 尾插一个INF
Go里面没有三目运算符,还是得写if
Go 堆
type hp []int func (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i] < h[j] } // > 为最大堆 func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *hp) Push(v interface{}) { *h = append(*h, v.(int64)) } func (h *hp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v } func (h *hp) push(v int) { heap.Push(h, v) } func (h *hp) pop() int { return heap.Pop(h).(int64) } // 稍微封装一下,方便使用 // 这是建立 // 如何使用呢? type hp64 []int64 func (h hp64) Len() int { return len(h) } func (h hp64) Less(i, j int) bool { return h[i] < h[j] } // > 为最大堆 func (h hp64) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *hp64) Push(v interface{}) { *h = append(*h, v.(int64)) } func (h *hp64) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v } func (h *hp64) push(v int64) { heap.Push(h, v) } func (h *hp64) pop() int64 { return heap.Pop(h).(int64) } // 稍微封装一下,方便使用
Go的移位运算符优先级高于算术运算符,其它常见语言都是低于
l := 0, r := arr.size() - 1 mid := l + r >> 1; // 先算>>再算+
Go 匿名函数,下面是二分
check := func(m int) bool { res := 0 for _, x := range piles { if x % m == 0 { res += x / m } else { res += x / m + 1 } } return res <= h }
Go for循环,没有
++i
,只有i++
,因为C++编译器会对i++
做优化。因此还是写i++
好了
本博客所有文章均采用 CC BY-NC-SA 4.0 协议 ,禁止商用,转载请注明出处!