关于我做字符串题目遇到的坑(列举两题)

805 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

题目一:7-1 删除字符串中指定字符(10 分)

题目描述:

删除字符串中的指定字符,字符串和要删除的字符均由键盘输入。

输入格式:

在第一行中输入一个长度不超过20的字符串、并以回车结束;在第二行中输入待删除的一个字符,并以回车结束。

输出格式:

在一行中输出删完指定字符的字符串。

输入样例:

abcdcf
c

输出样例:

abdf

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB PS: 这是第一道题目,可以说是签到题

思路分析:

  • 我们可以直接使用string优秀的迭代器来处理这样的题目
  • 想一想,直接使用erase就可以了
  • 因为erase会将迭代器后移一位

代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	cin >> s;
	char c;
	cin >> c;
	string::iterator it = s.begin();
	while (it != s.end()) {
		if (*it == c) {
			s.erase(it);
			continue;
		}
		it++;
	}
	cout << s;
}

结果如下:

image.png PS:不要被第一题骗了,第二题是个坑货~

第二题:7-2 删除非英文字母(10 分)

题目描述:

输入一个字符串,将组成字符串的所有非英文字母的字符删除后输出。

输入格式:

输入一个字符串。

输出格式:

将字符串的所有非英文字母的字符删除后输出。

输入样例:

abc123+xyz.5

输出样例:

abcxyz

代码长度限制   16 KB

时间限制     400 ms

内存限制     64 MB

看到这题,我内心直呼,这不是比第一题简单,然后我就按照题目一的做法来做,然后我看着4分陷入沉思

思路分析:

其实和第一题差不多,但是这是个坑货——输入的可能会有空行,然后就会寄
所以要用getline来输入

代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a, b;
	getline(cin, a);
	for (int i = 0; i < a.size(); i++) {
		if (isalpha(a[i]))
			b += a[i];
	}
	cout << b;
}

结果如下:

image.png ps:成功解题=理清思路+一定的技巧~