“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 !!!结尾无空行
根据题目我们可知,给定一个字符串,如果句子字符串中 3 < "6"的个数 < 10,则将这串连续的 6 替换成 9;但如果 10<= "6的个数 " ,则将这串连续的 6 替换成 27。
这题目可以分为两部分,一是判断,二是替换。
我们可以边判断边替换,设置个变量count 和 current,循环这个字符串,遇到 "6" 就将count+1,且将这个 "6" 的位置索引放入到current中,以此循环,当遍历到不是 "6" 的时候,就判断count的值决定替换与否,替换是替换为 "9" 还是 "27" ,然后可以使用字符串的replace()方法替换得到新的字符串,然后再用新的字符串重新遍历,依次循环最终得到结果。
注意:
1、是用替换后的新的字符串进行遍历
2、若字符串最后一个字符是 "6" ,那么不会进入到替换阶段,会直接执行完,所以得判断若字符串最后一个字符是 "6" ,那么最后也要判断count 来决定是否替换代码。
下面是代码,具体思想和上述一样,供大家参考。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string indata;
getline(cin, indata);
int length = indata.length() , i;
int current = 0 ,count=0;
for (i = 0; i < length;i++)
{
if(indata[i] == '6')
{
current = i;
count++;
}
if((indata[i]!='6' && count!=0) || (current == length-1 && indata[length-1] =='6' ))
{
if(count<=3)
{
count = 0;
continue;
}
else if(count>=4 && count<=9)
{
indata = indata.replace(current - count + 1, count, "9");
count = 0;
i = 0;
}
else if(count>=10)
{
indata = indata.replace(current - count + 1, count, "27");
count = 0;
i = 0;
}
}
length = indata.length();
}
cout << indata;
// 测试案例
//it is so 666 really 6666 what else can I say 6666666666
//6666 6666666666 oijoi 6666
}
改进:可以不需要将新的字符串进行遍历,节省时间,具体做法大家可多多思考。