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 關注
- 100 瀏覽
添加回答
舉報