原题链接:STIPC-001_D.小郭不想看文章
D.小郭不想看文章
题目背景
小郭最不喜欢阅读题目了,于是他想请你帮他,按照他的想法写一个程序进行文章的自动修整,方便小郭进行阅读。
题目描述
修整的规则很简单,只需要将给出的字符串按照指定的操作进行字符间的转换即可。
文章修整会涉及的操作如下:
- 将字符串中位置 A A A 至位置 B B B 的大写字母转换为小写字母,若没有大写字母则不进行任何操作。
- 将字符串中位置 A A A 至位置 B B B 的字符 “ ( ( (” 和 “ ) ) )” 对应转换为 “ [ [ [” 和 “ ] ] ]”。
- 在字符串中位置 A A A 的字符后换行。
- 删除字符串中位置 A A A 至位置 B B B 的字符。
给出一个整数 T T T ,代表会有 T T T 次操作,每次操作可能会给出整数 [ [ [ N N N、 A A A ] ] ] 或 [ [ [ N N N、 A A A 、 B B B ] ] ],其中 N N N 代表进行操作的序号。
若操作涉及两个整数,则会给出两个整数 A A A、 B B B, 若只涉及一个整数,则只给出一个整数 A A A。
现在小郭给你一个字符串 S S S(含空格)并告诉你需要操作的次数和需要进行的操作,请你输出修整后的字符串。输入格式
第一行给出一个字符串 S S S 。
第二行给出一个正整数 T T T 。
此后共 T T T 行,每行两个或三个整数: [ [ [ N N N、 A A A ] ] ] 或 [ [ [ N N N、 A A A 、 B B B ] ] ]。输出格式
一个字符串,为修整过后的字符串。
输入输出样例
样例一:
输入:
A b c D e F g AbcDeFg AbcDeFg
1 1 1
1 1 1 0 0 0 6 6 6
输出:
a b c d e f g abcdefg abcdefg
样例二:
K e − J i − J I E ( 2021.5.19 ) k k k Ke-Ji-JIE(2021.5.19)kkk Ke−Ji−JIE(2021.5.19)kkk
4 4 4
1 1 1 7 7 7 8 8 8
2 2 2 0 0 0 21 21 21
3 3 3 8 8 8
4 4 4 21 21 21 23 23 23
输出:
K e − J i − J i e Ke-Ji-Jie Ke−Ji−Jie
[ 2021.5.19 ] [2021.5.19] [2021.5.19]提示说明
【数据范围】:
1 ≤ T ≤ 20 1 \leq T \leq 20 1≤T≤20
1 ≤ S . L e n g t h ≤ 200 1 \leq S.Length \leq 200 1≤S.Length≤200
0 ≤ A , B < S . L e n g t h 0 \leq A ,B < S.Length 0≤A,B<S.Length
【提示】:
- 请注意,每次操作都是在最近一次操作后的字符串上进行的。
- 换行符 ‘\n’ 也是算作字符的。
题目解析:
本题考察字符串+模拟。
本题涉及知识点主要在对字符操作的理解运用以及一些常用的库函数,其次就是编写代码过程中的细心程度。
题目中有一个需要注意思考的点,因为可能有多次操作,那在经历过某次操作后(特别指操作3、操作4),原字符串的长度就可能会被改变,那此后的操作所指定的位置都应是在最新的字符串上的。这个小坑在原题链接中也给出了提示。
其次,换行符 ‘\n’ 在字符串 String 或字符数组中是占一个字符的。
其余的,注意每次操作时下标是否正确,按照题目描述编写代码即可。
AC代码(C++):
#include <iostream>
#include <string>
#include <istream>
using namespace std;
int main()
{
string S;
getline(cin, S); //利用getline可以读入空格,或者利用循环读入字符串也可。
int T, N, A, B;
cin >> T;
while (T--) //共 T 次操作
{
cin >> N;
if (N == 3) cin >> A;
else cin >> A >> B;
if (N == 1) //大写字母转换为小写字母
{
for (int i = A; i <= B; i++)
if (S[i] >= 'A' && S[i] <= 'Z')
S[i] += 32;
}
else if (N == 2) //转换括号
{
for (int i = A; i <= B; i++)
if (S[i] == '(') S[i] = '[';
else if (S[i] == ')') S[i] = ']';
}
else if (N == 3) //插入换行
{
string p = "";
p += S.substr(0, A + 1);
p += "\n";
p += S.substr(A + 1, S.length() - A - 1);
S = p;
}
else if (N == 4) //删除字符
{
string p = "";
p += S.substr(0, A);
p += S.substr(B + 1, S.length() - B - 1);
S = p;
}
}
cout << S;
}