Note-45899-619

Token ID: 1

ERC-721 1 Transfers

Metadata

{
  "title": "LeetCode 刷题常用数据结构(Go 篇)",
  "tags": [
    "post",
    "go",
    "algorithm",
    "leetcode"
  ],
  "sources": [
    "xlog"
  ],
  "external_urls": [
    "https://xlog.pseudoyu.com/algorithm_data_structure_go.md"
  ],
  "date_published": "2021-05-28T16:12:17.000Z",
  "content": "---\ntitle: \"LeetCode 刷题常用数据结构(Go 篇)\"\ndate: 2021-05-29T00:12:17+08:00\ndraft: false\ntags: [\"go\",\"algorithm\", \"leetcode\"]\ncategories: [\"Develop\"]\nauthors:\n- \"pseudoyu\"\n---\n\n## 前言\n\n最近重新开始用 Go 刷 LeetCode 算法题,针对工作需求的算法刷题其实主要是锻炼解决问题的思路和代码撰写能力,而不是像算法竞赛那样用复杂的数据结构,所以常用的数据结构和操作并不多,熟练使用也能很好地提升自己的代码质量,特此做一个整理,以便于查阅。\n\n## 数据结构\n\n### 数组\n\n#### 初始化\n\n```go\n// 初始化一个大小为10,默认值为0的数组\nnums := make([10]int)\n\n// 初始化一个二位boolean数组\nvisited := make([5][10]int)\n```\n\n#### 常用方法\n\n```go\nfor i := 0; i < len(nums); i++ {\n    // 访问num[i]\n}\n```\n\n### 字符串 String\n\n#### 初始化\n\n```go\ns1 := \"hello world\"\n\n// 创建多行字符串\ns2 := `This is a\nmultiline\nstring.`\n```\n\n#### 访问字符串\n\n```go\n// 可直接用索引访问字节(非字符)\ns1 := \"hello world\"\nfirst := s[0]\n\ns2 := []byte(s1)\nfirst := s2[0]\n```\n\n#### 修改字符串\n\n```go\n// 字符串的值是不可变的,可以分配一个新字符串值\ns := \"hello\"\nt := s\n\n// 将字符串转为[]byte或[]rune可以进行修改\ns1 := \"hello world\"\ns2 := []byte(s1)\ns2[0] = 'H'\ns3 := string(s2)\n```\n\n#### 查询字符是否属于特定字符集\n\n```go\n    // 判断字符串s的i索引位置字符是否是元音\n    if strings.Contains(\"aeiouAEIOU\", string(s[i])) {\n        // ...\n    }\n```\n\n#### 判断字符串大小\n\n```go\nif s1 == s2 {\n    // 相等\n} else {\n    // 不相等\n}\n\n// Compare 函数可以用于比较,1大于,0相等,-1小于\n// EqualFold 函数忽略大小写后比较\n```\n\n#### 拼接字符串\n\n```go\n// 支持直接用+进行连接,但是效率不高\ns1 := \"hello \"\ns2 := s1 + \"world\"\n```\n\n#### 高效拼接字符串\n\n```go\n// bytes.Buffer可以一次性连接\nvar b bytes.Buffer\nb.WriteString(\"Hello \")\nb.WriteString(\"World\")\nb1 := b.String()\n\n// 多个字符串拼接\nvar strs []string\nstrings.Join(strs, \"World\")\n```\n\n#### 整型 (或任意数据类型) 转为字符串\n\n```go\n// Itoa转换\ni := 123\nt := strconv.Itoa(i)\n\n// Sprintf转换\ni := 123\nt := fmt.Sprintf(\"%d\", i)\n```\n\n### 切片 slice\n\n#### 初始化\n\n```go\n// 初始化一个存储String类型的切片\nslice := make([]string, 0)\nslice := []string\n\n// 初始化一个存储int类型的切片\nslice := make([]int, 0)\nslice := []int\n```\n\n#### 常用方法\n\n```go\n// 判断是否为空\nif len(slice) == 0 {\n    // 为空\n}\n\n// 返回元素个数\nlen()\n\n// 访问索引元素\nslice[i]\n\n// 在尾部添加元素\nslice = append(slice, 1)\n```\n\n### 通过切片模拟栈和队列\n\n#### 栈\n\n```go\n// 创建栈\nstack := make([]int, 0)\n// push压入\nstack = append(stack, 10)\n// pop弹出\nv := stack[len(stack) - 1]\nstack = stack[:len(stack) - 1]\n// 检查栈空\nlen(stack) == 0\n```\n\n#### 队列\n\n```go\n// 创建队列\nqueue := make([]int, 0)\n// enqueue入队\nqueue = append(queue, 10)\n// dequeue出队\nv := queue[0]\nqueue = queue[1:]\n// 长度0为空\nlen(queue) == 0\n```\n\n### Map\n\n```go\n\n// 创建\nm := make(map[string]int)\n// 设置kv\nm[\"hello\"] = 1\n// 删除k\ndelete(m,\"hello\")\n// 遍历\nfor k, v := range m{\n    // 操作\n}\n\n// map键需要可比较,不能为slice、map、function\n// map值都有默认值,可以直接操作默认值,如:m[age]++ 值由0变为1\n// 比较两个map需要遍历,其中的kv是否相同,因为有默认值关系,所以需要检查val和ok两个值\n```\n\n### 标准库\n\n#### sort\n\n```go\n// int排序\nsort.Ints([]int{})\n// 字符串排序\nsort.Strings([]string{})\n```\n\n#### math\n\n```go\n// int32 最大最小值\nmath.MaxInt32\nmath.MinInt32\n// int64 最大最小值(int默认是int64)\nmath.MaxInt64\nmath.MinInt64\n```\n\n#### copy\n\n```go\n// 删除a[i],可以用 copy 将i+1到末尾的值覆盖到i,然后末尾-1\ncopy(a[i:], a[i+1:])\na = a[:len(a)-1]\n\n// make创建长度,则通过索引赋值\na := make([]int, n)\na[n] = x\n\n// make长度为0,则通过append()赋值\na := make([]int, 0)\na = append(a, x)\n```\n\n### 类型转换\n\n```go\n// byte转数字\ns = \"12345\"  // s[0] 类型是byte\nnum := int(s[0] - '0') // 1\nstr := string(s[0]) // \"1\"\nb := byte(num + '0') // '1'\nfmt.Printf(\"%d%s%c\\n\", num, str, b) // 111\n\n// 字符串转数字\nnum, _ := strconv.Atoi()\nstr := strconv.Itoa()\n```\n\n## 总结\n\n刷题路漫漫...加油!\n\n## 参考资料\n\n> 1. [LeetCode 官网](https://leetcode.com)\n> 2. [greyireland/algorithm-pattern](https://github.com/greyireland/algorithm-pattern)\n",
  "attributes": [
    {
      "value": "algorithm_data_structure_go.md",
      "trait_type": "xlog_slug"
    }
  ]
}