(迭代)外观数列


这题目一开始我看的一脸懵逼,不过这个理解起来其实还是挺简单的。就是后面那一个是在统计前面这一个数字出现的次数,然后看一下这个解释就很清楚明白了,不过就算我看懂了题目,我还是无从下手(还是我太菜了)

迭代算法

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这个东西可以用于拼接字符串而不会产生更大的内存占用。


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录