本文已参加「新人创作礼」活动,一起开启掘金创作之路。
直接干货,上代码:
// true=存在。false=不存在
func IsHave(target string, str_array []string) bool {
sort.Strings(str_array)
index := sort.SearchStrings(str_array, target)
//index的取值:0 ~ (len(str_array)-1)
return index < len(str_array) && str_array[index] == target
}
到此,只想解决问题,找到代码的同学可以撤退了,代码上述就可以
一下开始解析
先说 sort.Strings(str_array),执行这一步的排序的目的在于为下一步做好充足的准备,先进行排序之后,那就可以用 sort.SearchStrings 这个去找了,为什么呢?我们可以看一下 SearchStrings 这个方法的解释
// SearchStrings searches for x in a sorted slice of strings and returns the index
// as specified by Search. The return value is the index to insert x if x is not
// present (it could be len(a)).
// The slice must be sorted in ascending order.
//
func SearchStrings(a []string, x string) int {
return Search(len(a), func(i int) bool { return a[i] >= x })
}
可以只看最后一句 : The slice must be sorted in ascending order. == >>切片必须按升序排序。在问一个为什么呢?那就需要去看 Search 这个方法的定义了,简单说一下;二分法查找,这个查找使用二分法去查找,这样会大大节省查询的资源消耗,虽然排序的时候也会存在这个资源消耗的问题,但是相比于整个切片的循环查找,还是有很大的资源节省的;
哦,对了,补充一下,如果字符串不在切片中的时候,index返回值为1,所以在返回时,需要校验。所以会有这一步校验::str_array[index] == target。
留一个问题:return 这么写的原因有几个?