Golang刷题遇到的坑,sort排序相关

Golang的sort包提供了强大的切片排序功能,sort.Ints可以直接对int切片排序,sort.Slice可以自定义比较函数对任意切片排序,sort.Sort可以通过实现Len,Less,Swap三个接口实现更底层的自定义排序。一般来说使用sort.Slice就足够了。比如这一题,国王游戏,https://www.luogu.com.cn/problem/P1080,虽然难点在高精度,但高精度之前要根据大臣左右手值的乘积进行排序。本题可以将国王和大臣保存在一个二维切片中,切片每个元素存左手,右手,左右手乘积,因为只有大臣参与排序,所以sort可以这样做

sort.Slice(pr[1:], func(i, j int) bool {
	return pr[i][2] < pr[j][2]
})

这里其实已经犯了错了。比如如下数据

3
1 1
2 3
7 4
4 6

排序前数组是这样的

[[1 1 1] [2 3 6] [7 4 28] [4 6 24]]

按上面的排序定义后,排序后是这样的

[[1 1 1] [2 3 6] [7 4 28] [4 6 24]]

排序其实失败了,问题就出在sort.Slice(pr[1:],)这里,第一个参数如果写成部分切片的形式,则自定的sort函数也需要修改下标,不然调用底层快速排序下标会混乱。

pr = pr[1:]
sort.Slice(pr, func(i, j int) bool {
	return pr[i+1][2] < pr[j+1][2]
})

 

你可能感兴趣的:(GO,笔试基础知识,LeetCode刷题)