刷leetcode中常用的go基础语法点
基础声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| x := 0 s := []int{1, 2, 3} m := map[int]string{1: "a"}
s := make([]int, 0) s := make([]int, 0, 10) m := make(map[int]string)
dp := make([][]int, n) for i := range dp { dp[i] = make([]int, m) }
|
Slice 操作(每日必用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| s = append(s, x)
s = s[:len(s)-1]
s = s[1:]
sub := s[left:right]
for i, v := range s { } for i := range s { } for _, v := range s { }
copy(dst, src)
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i], s[j] = s[j], s[i] }
|
Map 操作
1 2 3 4 5 6 7 8 9
| m := make(map[int]int)
m[key] = value v := m[key] v, ok := m[key] delete(m, key)
for k, v := range m { }
|
循环
1 2 3 4 5 6 7 8 9 10 11 12
| for i := 0; i < n; i++ { }
for condition { } for left < right { }
for { }
for i := n - 1; i >= 0; i-- { }
|
排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import "sort"
sort.Ints(nums) sort.Strings(strs)
sort.Slice(nums, func(i, j int) bool { return nums[i] > nums[j] })
sort.Slice(users, func(i, j int) bool { return users[i].Age < users[j].Age })
|
栈和队列(用 slice 模拟)
1 2 3 4 5 6 7 8 9 10 11
| stack := []int{} stack = append(stack, x) top := stack[len(stack)-1] stack = stack[:len(stack)-1]
queue := []int{} queue = append(queue, x) front := queue[0] queue = queue[1:]
|
堆(优先队列)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import "container/heap"
type MinHeap []int
func (h MinHeap) Len() int { return len(h) } func (h MinHeap) Less(i, j int) bool { return h[i] < h[j] } func (h MinHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *MinHeap) Push(x any) { *h = append(*h, x.(int)) } func (h *MinHeap) Pop() any { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x }
h := &MinHeap{} heap.Init(h) heap.Push(h, x) top := heap.Pop(h).(int)
|
数学 / 极值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import "math"
math.MaxInt32 math.MinInt32 math.MaxFloat64
func max(a, b int) int { if a > b { return a } return b } func min(a, b int) int { if a < b { return a } return b }
func abs(x int) int { if x < 0 { return -x } return x }
|
字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| for _, ch := range s { }
s[i]
b := []byte(s) b[i] = 'x' s = string(b)
s := strings.Join(list, "")
parts := strings.Split(s, " ")
var sb strings.Builder sb.WriteString("hello") sb.WriteByte('!') result := sb.String()
|
BFS / DFS 常用模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| queue := [][]int{{startX, startY}} visited := make([][]bool, rows) for queue != nil { size := len(queue) for k := 0; k < size; k++ { cur := queue[0] queue = queue[1:] for _, dir := range [][]int{{0,1},{0,-1},{1,0},{-1,0}} { nx, ny := cur[0]+dir[0], cur[1]+dir[1] if nx >= 0 && nx < rows && ny >= 0 && ny < cols && !visited[nx][ny] { visited[nx][ny] = true queue = append(queue, []int{nx, ny}) } } } steps++ }
func dfs(grid [][]int, i, j int, visited [][]bool) { if i < 0 || i >= len(grid) || j < 0 || j >= len(grid[0]) || visited[i][j] { return } visited[i][j] = true dfs(grid, i+1, j, visited) dfs(grid, i-1, j, visited) dfs(grid, i, j+1, visited) dfs(grid, i, j-1, visited) }
|
LeetCode 常量(复制到文件最上面)
1 2
| const MOD = 1_000_000_007 const INF = math.MaxInt32
|
MOD 在动态规划计数题里几乎每次都有。
常用类型转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| strconv.Itoa(x) strconv.Atoi(s)
[]byte("hello") string(bs)
string(r) []rune(s)
float64(x)
int(f)
|
写在同一个文件顶部的 import 块
1 2 3 4 5 6
| import ( "math" "sort" "strconv" "strings" )
|
LeetCode 编辑器里不需要写 import——它会自动补。但写到本地 Go 文件时上面这段直接粘贴到文件头。