为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
www说 2023-01-03 11:14:02
假设我有输入和输出字符串,其中输出将是字符串中每个元素的频率和 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
查看完整描述

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)

    }

}


查看完整回答
反对 回复 2023-01-03
?
LEATH

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


查看完整回答
反对 回复 2023-01-03
  • 2 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号