1. 问题背景与需求分析
最近在PTA平台上遇到一个有趣的字符串处理题目,题目要求将输入字符串中连续出现的"6"进行特殊替换:当连续"6"的数量大于3且小于10时,替换为"9";当连续"6"的数量大于等于10时,替换为"27"。这个看似简单的题目实际上隐藏着几个字符串处理的经典陷阱。
问题的核心在于字符串替换操作会改变原字符串的长度,而很多初学者(包括最初的我)在处理这类问题时,往往会忽略这个关键细节。当我们在循环中处理字符串时,如果替换后没有及时更新字符串长度或索引位置,就会导致越界访问或遗漏字符等错误。
2. 初始解决方案与问题发现
2.1 初始代码实现
最初我采用了如下的C++实现方案:
cpp复制std::string str;
int cnt;
int j;
getline(std::cin, str);
int len = str.size();
for (int i = 0; i < len; i++) {
if (str[i] == '6') {
cnt = 1;
for (j = i + 1; j < len; j++) {
if (str[j] == '6') cnt++;
else break;
}
if (cnt > 3 && cnt < 10)
str.replace(i, cnt, "9"), len -= cnt - 1;
else if (cnt > 9)
str.replace(i, cnt, "27"), len -= cnt - 2;
cnt = 0;
}
}
std::cout << str;
2.2 暴露的问题
这段代码看似合理,但在实际测试中发现了以下问题:
- 长度更新不及时:字符串替换后长度发生变化,但循环条件仍使用初始长度
- 索引偏移错误:替换后没有正确调整索引位置,导致后续字符被跳过或重复处理
- 边界条件处理不足:对于连续"6"恰好为3个或10个的情况处理不够严谨
