“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!
本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。
输入格式:
输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。
输出格式:
从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。
输入样例:
it is so 666 really 6666 what else can I say 6666666666
输出样例:
it is so 666 really 9 what else can I say 27
思路过程:
1.大方向思路就是遍历每个元素,碰到‘6’计数器就++
2.遇到的问题
问题A:cnt一超过3就更改
问题B:发现更改完的字符串,用 i 指向的位置不是下一个了
解题思路 :
1.遍历时,为了记录连续的6,要从碰到 6 时,到不是6时,这时候再看cnt的数量,就可以解决问题A,但是又引出一个新问题,像特例中的末尾连续的6最后一个是遍历不到非 6 的
所以我一开始再str末尾加了个【0】,来解决这个问题(最后输出是记得删去
2.问题B我也是调试了很久,就是看更改之前 i 指向的字符 和 i 更改后指向的字符,然后通过 cnt来帮助 i 指向原本要指向的字符,因为程序一轮完会i++,所以 i 就是原本的大小
代码部分:
#include <iostream>
#include <string>
using namespace std;
// 24
// it is so 666 really 6666 what else can I say 6666666666[0]
// it is so 666 really 9 wh[a]t else can I say 27
// 21
int main()
{
string str;
getline(cin, str);
str += '0'; // 最后连续6到末尾,末尾还要加个字符【0】才能算cnt
int cnt = 0;
for (int i = 0; i < str.size(); i++)
{
// 从检查到6的位置 ----- 非6的位置
if (str[i] == '6')
{
cnt++;
}
else // 不是6 ---- > 检查cnt个数
{
if (cnt > 3 && cnt <= 9)
{
str.replace(i - cnt, cnt, "9");
i = i - (cnt - 1);
}
else if (cnt > 9)
{
str.replace(i - cnt, cnt, "27");
i = i - (cnt - 1);
}
cnt = 0;
}
}
str.erase(str.size() - 1); // 删去先前加的字符【0】
cout << str << endl;
return 0;
}