这题目一开始我看的一脸懵逼,不过这个理解起来其实还是挺简单的。就是后面那一个是在统计前面这一个数字出现的次数,然后看一下这个解释就很清楚明白了,不过就算我看懂了题目,我还是无从下手(还是我太菜了)
迭代算法
package main
import (
"log"
"strconv"
"strings"
)
func countAndSay(n int) string {
str := "1"
// 有n个数,我们就从n开始遍历(因为第一个数是确定的,所以我们从2开始)
for i := 2; i <= n; i++ {
// 与许多支持string类型的语言一样,golang中的string类型也是只读且不可变的。
// 因此,这种拼接字符串的方式会导致大量的string创建、销毁和内存分配。如果你拼接的字符串比较多的话,这显然不是一个正确的姿势。
var tmp strings.Builder
// 获取前缀(因为我们要统计字符串)
preByte := str[0]
count := 1
// 遍历str字符串
for j := 1; j < len(str); j++ {
// 如果下一个字符串等于这个前缀字符串,我们就进行+1操作
if str[j] == preByte {
count++
} else {
// 这里我们把这个数目加到字符串里面
tmp.WriteString(strconv.Itoa(count))
// 添加前缀
tmp.WriteByte(preByte)
// 我们开始统计下一个前缀
preByte = str[j]
// count数目置为0
count = 1
}
}
// 统计最后一个字符串的数目
tmp.WriteString(strconv.Itoa(count))
tmp.WriteByte(preByte)
str = tmp.String()
}
return str
}
func main() {
log.Println(countAndSay(50))
}
注意:这里我们为了避免占用内存,我们这里直接用的strings.Builder
这个东西可以用于拼接字符串而不会产生更大的内存占用。