本文简单介绍一些在刷题过程中常用的库或者语法,设计python和go
1. python常用数据结构
1.1 heapq库
heapq实现小顶堆。实现涉及堆排序的问题
1 | import heapq |
1.2 collections库
collections.defaultdict()函数
举例分析
1 | 初始化a为dict,如过某个key在a中不存在,那么在调用a[key]的时候,返回0。 |
collections.deque提供一个双端队列
1 | dq = collections.deque() |
1.3 python无穷大
1 | # 正无穷大 |
1.4 python lru_cache
python在做bfs或者dfs的时候,利用lru_cache来缓存中间结果,从而降低时间复杂度
1 | # None是不限制cache大小。@lru_cache(None)的作用是如果调用bfs这个函数,当输入aaa相同时,直接返回结果 |
1.5 python字典遍历
1 | a = {"a":1, "b":2} |
1.6 python集合操作
1 | a = set([1,2,2,3]) |
1.7 python数据排序
1 | a=[4,9,100,203] |
2. Golang常用数据结构
2.1 Golang循环
Golang没有while函数,只有for循环
- 无限循环
1
2
3
4
5
6
7for {
// pass
}
或者
for true {
// pass
} - 根据某变量循环
1
2
3
4sum := 100
for sum < 10 {
// pass
} - 固定循环数量
1
2
3for i:=0; i <= 10 ; i ++ {
// pass
} - 字典/数组遍历
1
2
3
4
5
6
7
8
9
10
11a_list := []int{1,2,3}
for _, v := range a_list{
//pass
}
b_dict := map[string]string{
"a": "a_v",
}
for k, v := range b_dict {
//pass
}2.2 Golang数组操作
- 初始化数组/切片
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//数组
var a_list [10] int
//切片
var b_slice [] int
var b_slice = make([]int, 10)
var b_slice = make([]int)
//初始化
c := []int{1,2,3}
//多维数组
d := [][]int{}
d := [][]int{
{1,2,3},
{4,5,6},
}
// 初始化m*n二维矩阵
visited := make([][]int, m)
for i := 0; i < m; i++ {
visited[i] = make([]int, n)
} - 切片元素操作(插入,删除,截取,拷贝)
1
2
3
4
5
6
7
8
9
10
11
12//插入元素
a := []int{}
append(a, 10)
//删除第2个元素
new_arr := append(a[:3], a[3:]...)
// 截取startIndex到endIndex-1之间的元素
arr[startIndex:endIndex]
//拷贝,将arr1拷贝给arr2
copy(arr1, arr2) - 获取数组长度
1
len(a_list)
- 数组作为函数参数
1
2
3func test(arr []int){
// pass
}2.3 Golang dict操作
- 初始化字典
1
2
3
4
5
6
7var a map[string]string
b := map[string]string{}
c := map[string]string{
"a":"b",
} - 删除字典元素
1
delete(a_map, a_key)
- 字典作为函数参数
1
2
3func test(aDict map[string]string) {
//pass
}2.4 Golang字符串操作
字符串相关操作使用strings包
- 获取字符串长度
1
import "strings"
- 字符串截取
1
2从start到end-1
s[start:end] - 字符串遍历
1
2
3
4
5s := "nihao"
sChar := []byte(s)
for i:=0; i < len(sChar); i++ {
fmt.Println(string(sChar[i]))
} - 字符串比较
1
strings.Compare(a, b)
- 字符串包含
1
strings.Contains(a, sub_a)
- 字符串分割
1
strings.Split(a, " ")
- 字符串是否含有前缀后缀
1
2strings.HasPrefix(s, s_pre)
strings.HasSuffix(s, s_suf) - 字符数组合并
1
2strings.Join([]string{"a", "b"})
输出"ab" - 字符串第一次出现的位置
1
strings.Index(s, sub_s)
- 字符串替换
1
2
3
4n是替换的次数,负数表示全部替换
func Replace(s, old, new string, n int) string
strings.Replace("nihao", "ni", "li", -1) - 字符串大小写转换
1
2
3
4
5func ToLower(s string) string
func ToUpper(s string) string
strings.Tolower("NIHao")
strings.ToUpper("nihao") - 字符操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24golang的字符(char)的类型为rune
相比于byte类型。byte是1个字节,rune是4个字节。
// byte is an alias for uint8 and is equivalent to uint8 in all ways. It is
// used, by convention, to distinguish byte values from 8-bit unsigned
// integer values.
type byte = uint8
// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
s := "中国"
sToRune := []rune{s}
string(sTorune[:1])//输出”中“
a := []rune{} //字符数组
// 字符串遍历 s= "abc"
for _, c := range s {
// c为rune类型
}
//字符转int
c := '1'
cToInt := int(c)
cToString := string(c)2.5 string与int转换
1
2
3
4
5// package strconv来实现互转
import strconv
//string to int
i, err := strconv.Atoi("-42")
s := strconv.Itoa(12)