【题目练习】外观数列

题目:

解题:

运行结果:

解题过程:

第一步:读题目

「外观数列」是一个数字字符串序列,由递归公式定义。

countAndSay(1) = "1"

countAndSay (n) 是 countAndSay (n-1) 的行程长度编码。

行程长度编码(RLE):把一串字符串里,连续相同的一组字符,替换成【这一组有多少个】+【这个字符本身】。

规则:先数个数,再写这个数字。

第二步:验证规则

n=1 → "1" (题目给的起点)

countAndSay (2) 是 countAndSay (1) 的 RLE 编码。countAndSay (1) 是 "1"。

看 "1":连续 1 个 1。按 RLE,个数 + 字符 → "1"+"1" = "11"。所以 n=2 → "11"。

n=3:对 n=2 的 "11" 做 RLE。"11":连续 2 个 1。个数 2,字符 1 → "2"+"1" = "21"。n=3 → "21"。

n=4:对 n=3 的 "21" 做 RLE。

现在看字符串 "21":第一个字符是 2,后面紧跟着是 1,不相等。

第一组:1 个 2 → "12"

第二组:1 个 1 → "11"

拼接起来:"12"+"11" = "1211"。

第三步:带入程序思路

我们需要从第 1 项开始,一轮一轮生成,生成到第 n 项为止。

迭代,而不是递归。递归会一层一层往下调,n 大的时候栈容易爆,而且会重复计算。迭代更简单,保存上一轮的字符串,不断更新,每次基于上一轮生成新串。所以优先选迭代。

然后思考:每一轮内部,怎么把旧字符串转成新字符串(RLE 编码)?

假设旧字符串 s,我们要遍历 s,统计连续相同字符。

模拟遍历过程,拿例子 s="21"(n=3 的结果,用来生成 n=4):指针 i 从 0 开始,i=0,字符是 '2'。

1、当前字符 cur='2',计数器 count=1。

2、i 往后走一步,i=1,字符是 '1',不等于 cur。

→ 这一组结束了:count=1,字符 '2'。追加 "12" 到新字符串。

3、更新 cur='1',count 重置为 1。

4、i 再往后走一步,i=2,超出字符串长度,循环结束。

(循环结束的时候,最后这一组还没有追加到新字符串!

所以遍历完整个字符串之后,必须把最后一组的 count 和 cur 补上。)

整理成小步骤:给定旧字符串 s:

1、初始化 i=0。

2、while i < s 的长度:

a. 记录当前字符 cur = s i

b. count=1

c. i +=1

d. 只要 i 没越界,并且 s i==cur,count++,i++

e. 一组结束,把 count 和 cur 写入新字符串

3、遍历结束,新字符串加上结束符 '\0'

相关推荐
青少儿编程课堂1 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot3 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
kongdong4 小时前
Hikyuu | RSI均值回归交易策略实现
算法·均值算法·回归·量化交易·交易策略·hikyuu
小王C语言4 小时前
优选算法:分治-归并排序
算法
非优秀程序员14 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
武子康21 小时前
驾驶轨迹换个坐标,就能给移动机器人用吗?
人工智能·算法·机器学习
lisw051 天前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术1 天前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer