sort.Search (二分)

sort.Search 需要自己实现接口 也比较简单
当然有很多实现方式 以下所展示的方式 是sort.SearchInts() 等中的实现方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"sort"
)

func main() {
a := []int{2, 4, 6}
// 第一个参数为数组长度 第二个实现函数
id := sort.Search(len(a), func(i int) bool {
return a[i] >= 1
})

fmt.Println(id)
}

当然也可以更简单一些直接调用sort.SearchInts()/ sort.SearchStrings()
如下

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
package main

import (
"fmt"
"sort"
)

func main() {
a := []int{2, 4, 6}
// go 的searchInts 返回右端点 应该是 >= 的二分
// 例如
id := sort.SearchInts(a, 1)
fmt.Println(id) // 输出 0

id = sort.SearchInts(a, 2)
fmt.Println(id) // 输出 2

id = sort.SearchInts(a, 3)
fmt.Println(id) // 输出1

id = sort.SearchInts(a, 7)
fmt.Println(id) // 3

/*
即如果存在这个数 那么就会输出这个数在数组中的位置
如果该数不存在 则返回大于他的一个数的位置
*/
}

map的相关使用

go 的map为内置结构 不需要额外引入但使用起来与其他语言略有差别

map的基础使用

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
// map 的定义 这样最简洁
m := map[int]int{}
// 也可以这样
m1 := make(map[int]int)

// 赋值
m[0] = 1

// 判断值是否存在
// golang里面目前只能这种方法
// 存在则ok 为true 否则为false
if v,ok := m[0];ok{
fmt.Println(v)
}else{
fmt.Println("不存在")
}

// 遍历map中的键
for k := range m{
fmt.Println(k)
}

// 遍历map中的键值对
// 目前不存在可以直接遍历值的操作
for k,v := range m{
fmt.Println(k,v)
}

map 当set使用

go基本库函数里面没有set 要外部引入 但可以用map当作set
通常是将不同的键均指向一个相同的值即可

1
2
3
4
5
6
7
8
s := map[int]int{}
// 我个人通常喜欢指向-1
s[0] = -1
s[1] = -1
s[241] = -1
for v := range s{
fmt.Println(v)
}

排序sort

go的排序使用sort库函数 和c++有些类似
可以使用 sort.Ints() sort.Slice()
但建议统一使用sort.Slice() 不容易出错 sort.Ints()显然只能匹配int型且只能正序 同理float型也是一个道理只能和相应类型的匹配

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
31
32
33
34

package main

import (
"fmt"
"sort"
)

func main() {
nums := []int{2, 1, 6, 3, 5, 4}
// 正序
sort.Slice(nums, func(i, j int) bool {
return nums[i] < nums[j]
})
// 等价于
sort.Ints(nums)
/*
排序结果:
[1 2 3 4 5 6]
*/

// 多维数组 自定义排序规则
maritx := [][]int{
{3, 2}, {4, 1}, {9, 3},
}
sort.Slice(maritx, func(i, j int) bool {
return maritx[i][1] < maritx[j][1]
})
fmt.Println(maritx)
/*
排序结果: [[4 1] [3 2] [9 3]]
*/
}

数字与字符串之间的相互转换

go 语言不能直接用string 去转 不然会得到一个空值 这个还是蛮坑的 正确的要使用strconv库中的Itoa方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
"strconv"
)

func main() {
a := 131
s := strconv.Itoa(a)
fmt.Printf("%s %T \n", s, s)

ss := "123"
/*
这里也是一个坑点
Atoi返回的转换完后的b 以及err
由于这里err 并不会再使用所以使用_
*/
b, _ := strconv.Atoi(ss)
fmt.Printf("%v %T \n", b, b)
}