Go杂谈

这里记录一下个人用Go刷题来学习Go语法的一些心得。

  1. Go-String
    Go 的字符串本身就是由单个字节连接起来的,因此遍历的时候就是字节byte
    因此做题时一般把res声明为字节切片,用append添加等操作,最后再转成string

    res = []byte {}
  2. Go-map,unordered_map
    Go里面好像没有unordered_map,先用map

    mp = map[string]int {} // key string, value int  
  3. 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} 
  4. string 转 int

    cnt, _ := strconv.Atoi(str)
  5. sort和二分搜索

    nums := []int {1, 5, 4, 2, 3}
    sort.Ints(nums)
    j := sort.SearchInts(arr, target)  // 直接返回下标
  6. append头插和尾插

    arr := make([]int, n)
    const INF = 0x3f3f3f3f;
    arr = append([]int{0}, arr...) // 头插一个0
    arr = append(arr, INF)         // 尾插一个INF
  7. Go里面没有三目运算符,还是得写if

  8. 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) } // 稍微封装一下,方便使用
  9. Go的移位运算符优先级高于算术运算符,其它常见语言都是低于

    l := 0, r := arr.size() - 1
    mid := l + r >> 1; // 先算>>再算+
  10. 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
    }
  11. Go for循环,没有++i ,只有i++,因为C++编译器会对i++做优化。因此还是写i++好了


本博客所有文章均采用 CC BY-NC-SA 4.0 协议 ,禁止商用,转载请注明出处!