1.题目
“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
结尾无空行
2.解题思路
首先从头到尾判断连续6的个数,如果6的个数超过3但没有超过9则记为第一种情况,即type=1,如果6的个数超过9则记为第二种情况,即type=2。 如果属于这两种,则将6的开始位置,连续6的个数,类型type放入结构体类型的容器中。然后从后往前遍历字符串,将相应位置的字符及其后面的字符串进行替换。
字符串替换函数replace(),从前往后的参数依次为:开始位置(从0开始),要替换的原字符串的长度,替换成的字符串。
s.replace(t[i].pos,t[i].sum,"9");
3.代码
#include <bits/stdc++.h>
using namespace std;
struct T{
int pos;
int type;
int sum;
};
int main()
{
string s;
getline(cin,s);
int f=0;
int sum=0;
int l=0;
vector<T> t;
for(int i=0;i<s.length();i++)
{
if(s[i]=='6')
{
if(f==0)
{
f=1;
l=i;
}
sum++;
}
if(s[i]!='6'|| i==s.length()-1)
{
if(f==1)
{
f=0;
if(sum>3&&sum<=9)
{
T t1;
t1.pos=l;
t1.type=1;
t1.sum=sum;
t.push_back(t1);
}
else if(sum>9)
{
T t1;
t1.pos=l;
t1.type=2;
t1.sum=sum;
t.push_back(t1);
}
sum=0;
l=0;
}
}
}
for(int i=t.size()-1;i>=0;i--)
{
if(t[i].type==1)
{
s.replace(t[i].pos,t[i].sum,"9");
}
else if(t[i].type==2)
{
s.replace(t[i].pos,t[i].sum,"27");
}
}
cout<<s<<endl;
return 0;
}