【ybt高效进阶2-1-3】单词替换

单词替换

题目链接:ybt高效进阶2-1-3

题目大意

输入一个字符串,以回车结束。

该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。

现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

思路

这道题内容其实很容易实现,就每找到一个单词,判断一下是不是要更改的。
如果是,就输出更改后的,否则就输出原来了。

但是这道题读入非常的烦人,恶心。(反正我是一直错了好久)
【ybt高效进阶2-1-3】单词替换
(第一次,我是用 gets,然后在 Lunix 上样例都不会转,而且别的还 RE 了)
(第二次,我改成了用 getchar 来一个一个读入,结果全都 RE了)
(第三次,同一个道理,不过看了很久之后发现处理最后一个单词的部分本来是应该输出到 n − 1 n-1 n−1,我弄成了 n n n,就 RE 了)
(第四次,把上面发现的问题改了过来,发现 TLE,应该是因为最后一行并没有换行符,第三个 while 读不到换行符,就退出不了,就 TLE 了)
(第五次,又用回了 gets,然后发现用 gets 读入会把换行符也读入)
(第六次,问了 GJY,试了一下 getline,发现还是会读入换行符。然后就想到了一个方式:算字符串长度的时候减一,就把最后的换行符自动忽略了)

代码

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>

using namespace std;

int sn, st, an, bn;
string s, a, b;
bool nc;

int main() {
	getline(cin, s);
	getline(cin, a);
	getline(cin, b);
	
	sn = s.size() - 1;//这样读入的时候会吧换行符读进去,所以算长度的时候要去掉换行符
	an = a.size() - 1;
	
	st = 0;
	nc = 1;
	for (int i = 0; i < sn; i++) {
		if (s[i] == ' ') {
			if (nc && (i - 1) - st + 1 == an) {
				cout << b;
				printf(" ");
			}
			else {
				for (int j = st; j <= i; j++)
					putchar(s[j]);
			}
			st = i + 1;
			nc = 1;
		}
		else {
			if (nc && (i - st + 1 > an || s[i] != a[i - st])) nc = 0;
		}
	}
	
	if (nc && (sn - 1) - st + 1 == an) {
		cout << b;
		printf(" ");
	}
	else {
		for (int j = st; j < sn; j++)
			putchar(s[j]);
	}
	
	return 0;
}

上一篇:深度学习笔记(三十一)三维卷积及卷积神经网络


下一篇:10 个例子教你学会 ncat (nc) 命令