【c++】L1-058 6翻了

“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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值