如何根据地图中的索引打印每个元素字符串及其频率-Golang

假设我有输入和输出字符串,其中输出将是字符串中每个元素的频率和 char 本身


input := "programming"

output := "p2ro2ga2min"

找到不同字符的频率后,如何根据索引打印它


这是我的代码


func countFreq(s string)  {

    sMap := make(map[string]int)


    for _, v := range s {

        sMap[string(v)]++

    }


    for i, v := range sMap {

        fmt.Printf("%v%v", i, v)

    }


    // Don't know what to do next


}


The output of code is 

output: n1p1r2o1g2a1m2i1


www说
浏览 159回答 2
2回答

有只小跳蛙

这是我之前想到但刚刚开始写作的替代方案。它使用字符串来跟踪符文顺序,但如果速度很重要,您可以使用字符串生成器。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)    }}

LEATH

您正在计算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: programmingOut: p2ro2ga2minIn: abOut: abIn: abaOut: 2abIn: aabcdeacOut: 3ab2cde
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go