【Go基础】Go算法常用函数整理

server/2024/12/14 5:32:20/

Go算法常用函数整理

使用 Go 语言编写算法题时,掌握一些常用的函数和用法可以大大提高效率。

1. 排序 (slices 包):

  • slices.Sort(x []T) 对切片 x 进行升序排序。需要 Go 1.18+ 版本。T 需要实现 constraints.Ordered 接口,例如 int, int64, float64, string 等。注意:这个函数在之前的版本里使用sort.Slice,现在推荐使用slices.Sort

  • slices.SortFunc(x []T, less func(a, b T) bool) 使用自定义的比较函数 less 对切片 x 进行排序。这个函数在之前的版本里使用 sort.Slice,现在推荐使用 slices.SortFunc

    import "slices"nums := []int{3, 1, 4, 1, 5, 9, 2, 6}
    slices.Sort(nums) // 升序排序
    println(nums)      // 输出:[1 1 2 3 4 5 6 9]strs := []string{"apple", "banana", "orange"}
    slices.Sort(strs)
    println(strs)    // 输出: [apple banana orange]// 自定义排序(按字符串长度降序)
    slices.SortFunc(strs, func(a, b string) bool {return len(a) > len(b)
    })
    println(strs) // 输出:[banana orange apple]
    
  • slices.Max(x []T):返回切片x中的最大值。

    package mainimport ("fmt""slices"
    )func main() {numbers := []int{0, 42, -10, 8}fmt.Println(slices.Max(numbers))
    }
    

    输出:42

  • slices.Min(x []T):返回切片x中的最小值。(用法同Max一致)

  • slices.Reverse(x []T):反转切片中的元素。

    package mainimport ("fmt""slices"
    )func main() {names := []string{"alice", "Bob", "VERA"}slices.Reverse(names)fmt.Println(names)
    }
    

    输出:[VERA Bob alice]

  • slices.Equal(s1, s2 []T) bool:判断两个切片是否相等:长度相同且所有元素相等。 如果长度不同,Equal 返回 false。 否则,将按索引递增的顺序比较元素,比较在第一对不相等时停止。 空片和零片被视为相等。 浮点 NaN 不视为相等。

2. 数学运算 (math 包):

  • 内建的**max/min**函数:返回两个数中的最大值/最小值。
  • math.Abs(x float64) 返回 x 的绝对值。
  • math.Max(x, y float64) / math.Min(x, y float64) 返回 xy 中的最大值/最小值。
  • math.Pow(x, y float64) 返回 xy 次方。
  • math.Sqrt(x float64) 返回 x 的平方根。
  • math.Ceil(x float64) / math.Floor(x float64) 返回不小于/不大于 x 的最小/最大整数。

3. 字符串操作 (strings 包):

  • strings.Split(s, sep string) 将字符串 s 按分隔符 sep 分割成字符串切片。
  • strings.Join(elems []string, sep string) 将字符串切片 elems 用分隔符 sep 连接成一个字符串。
  • strings.Contains(s, substr string) 判断字符串 s 是否包含子串 substr
  • strings.HasPrefix(s, prefix string) / strings.HasSuffix(s, suffix string) 判断字符串 s 是否以 prefix/suffix 开头/结尾。
  • strconv.Atoi(s string) 将字符串 s 转换为整数。
  • strconv.Itoa(i int) 将整数 i 转换为字符串。

4. 切片操作:

  • append(slice []T, elems ...T) 向切片 slice 追加元素。
  • len(slice) 获取切片长度。
  • cap(slice) 获取切片容量。
  • 切片截取: slice[i:j] 截取从索引 ij-1 的元素。

5. 堆 (container/heap 包):

Go 的 container/heap 包提供了堆的实现,常用于 Top K 问题、优先队列等。

import ("container/heap"
)// 定义一个堆的类型
type IntHeap []intfunc (h IntHeap) Len() int           { return len(h) }
func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] } // 小根堆
func (h IntHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }func (h *IntHeap) Push(x any) {*h = append(*h, x.(int))
}func (h *IntHeap) Pop() any {old := *hn := len(old)x := old[n-1]*h = old[0 : n-1]return x
}// 使用
h := &IntHeap{2, 1, 5}
heap.Init(h)          // 初始化堆
heap.Push(h, 3)       // 推入元素
println(heap.Pop(h).(int)) // 弹出堆顶元素 (输出 1)

6. 哈希表 (map):

Go 的 map 提供了高效的哈希表实现。

m := make(map[string]int) // 创建一个 string 到 int 的映射
m["apple"] = 1
m["banana"] = 2
val, ok := m["apple"] // 获取值,ok 表示键是否存在
if ok {println(val) // 输出 1
}
delete(m, "apple") // 删除键值对

7. 链表 (container/list 包):

虽然切片在很多情况下已经足够使用,但如果需要频繁进行插入和删除操作,可以使用 container/list 包提供的双向链表。

8. 位运算:

位运算在某些算法中可以提高效率,例如:

  • &:按位与
  • |:按位或
  • ^:按位异或
  • <<:左移
  • >>:右移

9. 其他常用技巧:

  • 使用 make 初始化切片和 map, 避免 nil 指针异常。
  • 使用 range 遍历切片和 map。
  • 注意边界条件和空输入。
  • 使用 defer 进行资源清理。

http://www.ppmy.cn/server/150016.html

相关文章

EventSource和WebSocket用法

EventSource和WebSocket用法 介绍1、WebSocket属性vue组件直接使用单例模式创建webSocket连接&#xff08;1&#xff09;声明socket&#xff08;2&#xff09;组件使用 2、EventSource属性get请求post请求 介绍 我们已熟知HTTP协议&#xff0c;但该协议只能由客户端发起&#…

可视化数据

数据科学家会直观呈现数据&#xff0c;以更好地理解数据。 他们可以扫描原始数据、检查摘要度量值&#xff08;如平均值&#xff09;或绘制数据图表。 图表是一种可视化数据的强有力方式&#xff0c;数据科学家经常使用图表快速了解适度复杂的模式。 直观地表示数据 绘制图表…

springboot425滑雪场管理系统(论文+源码)_kaic

摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定滑雪场管理系统的总体功能模块。然后&#xff0c;详…

数据结构开始——时间复杂度和空间复杂度知识点笔记总结

好了&#xff0c;经过了漫长的时间学习c语言语法知识&#xff0c;现在我们到了数据结构的学习。 首先&#xff0c;我们得思考一下 什么是数据结构&#xff1f; 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素…

MySQL|通过JSON_UNQUOTE实现MySQL中JSON数据的干净提取

文章目录 语法使用示例注意事项 JSON_UNQUOTE() 是 MySQL 中用于处理 JSON 数据类型的一个函数。它的主要作用是从 JSON 字符串中移除最外层的引号&#xff0c;这对于从 JSON 对象或数组中提取字符串值特别有用。 语法 JSON_UNQUOTE(json_string)json_string: 这是你想要去掉引…

笔记本电脑升级硬盘存储、Windows10系统安装及后续步骤(以联想ThinkPad X1 Carbon Gen10为例)

文章目录 1.前言2.材料准备3.Win10系统安装盘制作3.1 系统下载3.2 系统启动U盘刻录 4.拆机更换硬盘5.开机启动项修改6.系统安装&#xff08;以Win10为例&#xff09;7.系统安装后可能需要的步骤7.1 缺少WIFI等网络驱动7.2 系统激活7.3 办公软件安装 8.旧硬盘变废为宝参考文献 1…

短视频矩阵抖音SEO源码OEM独立部署

短视频优化矩阵源码涉及对抖音平台上的视频内容进行筛选与排序&#xff0c;目的是增强其在搜索引擎中的可见度&#xff0c;以便更多用户能够浏览到这些视频。而抖音SEO优化系统则是通过构建一个分析框架&#xff0c;来解析抖音上的用户数据、视频信息及标签等元素&#xff0c;并…

手机租赁系统开发全面解析与实现指南

内容概要 手机租赁系统的设计理念是为了满足用户对便捷、灵活的手机使用需求。想象一下&#xff0c;谁还愿意花大价钱买一部手机呢&#xff1f;尤其是当新款手机频繁推出时&#xff0c;租赁似乎成了更受欢迎的选择。这个系统旨在让用户可以随时随地选择租用不同型号的手机&…