2 回答
TA贡献1824条经验 获得超8个赞
这是我之前想到但刚刚开始写作的替代方案。
它使用字符串来跟踪符文顺序,但如果速度很重要,您可以使用字符串生成器。
func countFreq(s string) {
sMap := make(map[rune]int)
sOut := ""
for _, c := range s {
sMap[c]++
if sMap[c] == 1 {
sOut += string(c)
}
}
for _, c := range sOut {
if sMap[c] > 1 {
fmt.Print(sMap[c])
}
fmt.Printf("%c", c)
}
}
TA贡献1936条经验 获得超7个赞
您正在计算runes,因此使用 的映射map[rune]int,这样您就可以忽略返回到 的转换string。
地图是无序的,因此如果您希望输出与输入的顺序相同,则不能(不应该)遍历地图。
一旦你计算了字母,再次在输入字母上进行范围,并从地图中获取频率,并将其删除。如果计数大于 1,也打印该数字。
func countFreq(s string) {
sMap := make(map[rune]int)
for _, v := range s {
sMap[v]++
}
for _, v := range s {
count := sMap[v]
if count == 0 {
continue // Char already printed and removed
}
delete(sMap, v)
if count > 1 {
fmt.Print(count)
}
fmt.Print(string(v))
}
}
测试它:
for _, s := range []string{"programming", "ab", "aba", "aabcdeac"} {
fmt.Println("In:", s)
fmt.Print("Out: ")
countFreq(s)
fmt.Println()
}
这将输出(在Go Playground上尝试):
In: programming
Out: p2ro2ga2min
In: ab
Out: ab
In: aba
Out: 2ab
In: aabcdeac
Out: 3ab2cde
- 2 回答
- 0 关注
- 158 浏览
添加回答
举报
