(1)(字符串解码)“行程长度编码”(Run-Length Encoding)是一种无损压缩算法,常用于压缩重复字符较多的数据,以减少存储空间。假设原始字符串不包含数字字符。压缩规则如下:i) 如果原始字符串中一个字符连续出现 $N$ 次($N \geq 2$),在压缩字符串中它被表示为“字符 + 数字 $N$”。例如,编码 A12 代表 $12$ 个连续的字符 A。ii) 如果原始字符串中一个字符只出现 $1$ 次,在压缩字符串中它就表示为该字符本身。例如,编码 B 代表 $1$ 个字符 B。
以下程序实现读取压缩字符串并输出其原始的、解压后的形式。试补全程序。
#include <cctype>
#include <iostream>
#include <string>
using namespace std;
int main() {
string z;
cin >> z;
string s = "";
for (int i = 0; i < z.length(); ) {
char ch = z[i];
if (__①__ && isdigit(z[i + 1])) {
i++;
int count = 0;
while (i < z.length() && isdigit(z[i])) {
count = __②__;
i++;
}
for (int j = 0; j < __③__; ++j) {
s += ch;
}
} else {
s += __④__;
__⑤__;
}
(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)这道题考行程长度编码(RLE)解码,拿到题先想:当前字符后面是不是数字?是就进位解析多位数并重复输出,不是就原样输出并单步前进,核心就是判断边界与数字累加。
很多学生直接在 if 里写 isdigit(z[i+1]),忽略了 i+1 可能越界,尤其当字符串末尾是数字时直接访问会出错;解析多位数时有人只写 z[i]-'0',以为只取个位,其实题目明确 N≥2 且可能有多位,必须用 count*10+digit 的模板;还有人在 else 分支忘记 i++,导致死循环或重复处理;判断条件里把 i 和 i+1 混用也会逻辑混乱,一定要先检查长度再查字符。
这道题考行程长度编码(RLE)解码,拿到题先想:当前字符后面是不是数字?是就进位解析多位数并重复输出,不是就原样输出并单步前进,核心就是判断边界与数字累加。
概念解释:RLE 就是把连续重复的字符压缩成“字符 + 重复次数”,如 AAAAA 变成 A5。解压时就要反过来:看到“字符 + 数字”,就重复输出那个字符数字次;如果字符单独出现,就原样输出。数字可能是多位(如 12 表示 12 个 A),所以解析数字不能用简单的减法,得用“累乘累加”的模板:每次读到一位数字,就把当前结果乘以 10 再加上这一位的数值。
命题视角:命题人喜欢在这里挖两个坑:一是越界,二是多位数解析。第一个空①,if 条件里直接写 isdigit(z[i+1]) 很诱人,但别忘了 z[i+1] 必须存在,所以必须先判断 i+1 < z.length(),否则当字符串末尾是数字时就会数组越界,这是典型的“先判长度再判内容”套路。第二个空②,很多人会选 C(z[i]-'0'),以为只取个位,但题目明确 N≥2 且可能有多位,比如“B12”要输出 12 个 B,所以必须用 B 选项 count*10+(z[i]-'0'),这才是解析多位数的标准写法。第三个空③,循环次数当然是 count 本身,直接填 B。第四个空④,else 分支是单个字符,直接把 ch 加进 s 即可,选 B。第五个空⑤,单个字符处理完,指针只前进一位,填 C(i++)。
思考心法:拿到题先整体看编码规则,再逐段对应代码。主循环用 for(int i=0;i<z.length(); ),因为 i 会在 if/else 里自己动,所以循环条件不变。先取 ch=z[i],然后判断“后面是不是数字”:先检查 i+1 不越界,再检查 isdigit(z[i+1])。如果满足,i++ 跳过字符,进入 while 解析数字:while(i<z.length() && isdigit(z[i])),里面用 count=count*10+(z[i]-'0') 累加,i++ 继续读下一位。解析完 count 后,用 for(j=0;j<count;++j) 把 ch 重复输出。如果不满足 if 条件,说明是单个字符,直接 s+=ch,然后 i++ 前进一位。
避坑提醒:① 越界是高频陷阱,务必先判长度;② 多位数解析必须用累乘累加,别偷懒只减'0';③ else 分支别忘 i++,否则死循环;④ 判断条件里 i 和 i+1 别混用,逻辑要清晰。
考频与趋势:循环结构在题库中非常活跃,共考过 609 题,覆盖 12 个级别,从 2008 年的 7 题一路增长,到 2026 年已达 161 题,2025 年更是 158 题,说明循环控制是近年必考热点;字符串算法相对较少,仅 7 题,但集中在 CSP 提高级和入门级,2025 年已考 3 题,呈上升趋势。这类 RLE 解码题属于字符串处理与循环控制的交叉点,未来很可能继续以“完善程序”或“填空”形式出现,尤其会加大多位数字解析和边界判断的考查力度。
预测:基于 2025 年字符串算法考频已达 3 题且逐年递增,以及循环结构的高频特性,预计 2026 年仍会有 1-2 题涉及字符串解码或编码,形式可能更复杂,比如加入嵌套循环或动态规划思想,但核心仍是“先判边界、再解析数字、最后重复输出”这一主线。暂无足够依据预测具体题型变化,但建议重点练习多位数解析模板和越界判断逻辑。