Mer*_*ler 2 sorting algorithm go
我正在研究一个算法问题,我需要用 golang 对其进行编码。在这个问题中,我需要按字符“a”对给定的字符串数组进行排序。如果我需要谈谈问题的细节。
\n问题:
\n Write a function that sorts a bunch of words by the number of character \xe2\x80\x9ca\xe2\x80\x9ds within the\nword (decreasing order). If some words contain the same amount of character \xe2\x80\x9ca\xe2\x80\x9ds then you\nneed to sort those words by their lengths\nRun Code Online (Sandbox Code Playgroud)\n输入
\n["aaaasd", "a", "aab", "aaabcd", "ef", "cssssssd", "fdz", "kf", "zc", "lklklklklklklklkl", "l"]\nRun Code Online (Sandbox Code Playgroud)\n输出:
\n["aaaasd", "aaabcd", "aab", "a", "lklklklklklklklkl", "cssssssd", "fdz", "ef", "kf", "zc", "l"]\nRun Code Online (Sandbox Code Playgroud)\n我的解决方案:
\nfunc main() {\n\n arr := []string{"aaaasd", "a", "aab", "aaabcd", "ef", "cssssssd", "fdz", "kf", "zc", "lklklklklklklklkl", "l"}\n fmt.Println(mostFrequent(arr))\n}\n\ntype FrequencyAndLength struct {\n slice string\n mostFrequent int\n len int\n}\n\nfunc mostFrequent(arr []string) []FrequencyAndLength { // assuming no\n testArray := []FrequencyAndLength{}\n for _, a := range arr {\n\n testArray = append(testArray, FrequencyAndLength{\n slice: a,\n mostFrequent: strings.Count(a, "a"),\n len: len(a),\n })\n\n }\n fmt.Println(testArray)\n return testArray\n}\n\n\nRun Code Online (Sandbox Code Playgroud)\n我目前正在获取 a 的数量以及其中每个元素的长度。我需要首先按 a 的数量排序,如果 a 的数量为偶数,则按长度排序,按降序排列,但从逻辑上讲,我被困在这里。
\n用于sort.Slice()按自定义逻辑对任何切片进行排序。该函数需要一个定义两个元素之间“较少”关系的函数。
在您的情况下,如果一个值包含更多字符,或者计数相等,则该值小于另一个值a,然后比较它们的长度。要计算子字符串,请使用strings.Count(). 要获取 a 的长度string,请使用内置len()函数,但请注意,它len()返回 UTF-8 编码的字节长度,而不是符文数。对于字母,请使用utf8.RuneCountInString().
例如:
in := []string{"aaaasd", "a", "aab", "aaabcd", "ef", "cssssssd", "fdz", "kf", "zc", "lklklklklklklklkl", "l"}
sort.Slice(in, func(i, j int) bool {
s1, s2 := in[i], in[j]
count1, count2 := strings.Count(s1, "a"), strings.Count(s2, "a")
if count1 != count2 {
return count1 > count2
}
return utf8.RuneCountInString(s1) > utf8.RuneCountInString(s2)
})
fmt.Println(in)
Run Code Online (Sandbox Code Playgroud)
这将输出(在Go Playground上尝试):
[aaaasd aaabcd aab a lklklklklklklklkl cssssssd fdz ef kf zc l]
Run Code Online (Sandbox Code Playgroud)
a请注意,包含相同数量' 且具有相同长度的元素之间的顺序是未指定的。如果您希望它们的顺序与输入切片中的顺序相同,请使用sort.SliceStable()代替sort.Slice()。
另请注意,我们的自定义逻辑并不复杂,但也不简单。该函数可能会被多次调用来比较元素,并且同一元素可能会被多次传递(询问)。如果输入切片很大,a则为每个元素计算一次 的数量和符文长度,将它们存储在例如映射中,然后仅在函数中查询此预先计算的数据可能会有利可图less()。
它可能是这样的:
// Pre-calculate
type info struct{ count, length int }
calculated := map[string]info{}
for _, s := range in {
calculated[s] = info{
count: strings.Count(s, "a"),
length: utf8.RuneCountInString(s),
}
}
sort.Slice(in, func(i, j int) bool {
inf1, inf2 := calculated[in[i]], calculated[in[j]]
if inf1.count != inf2.count {
return inf1.count > inf2.count
}
return inf1.length > inf2.length
})
Run Code Online (Sandbox Code Playgroud)
这输出相同。在Go Playground上尝试一下。