func countLastOne(s string) string { type kv struct { key string value int } var count []kv pk := "" for i := range s { if pk == s[i:i+1]{ count[len(count)-1].value = count[len(count)-1].value + 1 } else { count = append(count , kv{ key : s[i:i+1], value: 1, }) } pk = s[i:i+1] } res := "" for i := 0; i < len(count); i++ { if count[i].key != "" && count[i].value != 0{ res = fmt.Sprintf("%v%v%v", res, count[i].value, count[i].key) } } return res } func countAndSay(n int) string { if n == 1{ return "1" } else { return countLastOne(countAndSay(n-1)) } }
这题要注意:
- 递归
- 普通的 map 没顺序,所以自己写一个 []kv 保存数据
- count 在前
- key : s[i:i+1] 简单处理