蓝桥杯 字符串变换 字符串操作

问题描述
  相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了。今天,徐老师想测试一下大家对于字符串操作的掌握情况。徐老师自己定义了1,2,3,4,5这5个参数分别指代不同的5种字符串操作,你需要根据传入的参数,按照徐老师的规定,对输入字符串进行格式转化。
  徐老师指定的操作如下:
  1 表示全部转化为大写字母输出,如abC 变成 ABC
  2 表示全部转换为小写字母输出,如abC变成abc
  3 表示将字符串整个逆序输出,如 abc 变成 cba
  4 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc
  5表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a-d,其次,-至少代表1个字母,既如果是ab,则不需要转换为缩写形式。
输入格式
  一共一行,分别是指代对应操作的数字和字符串,两者以空格分隔,字符串全部由英文字母组成
输出格式
  输出根据上述规则转换后对应的字符串
样例输入
5 ABcdEE
样例输出
a-ee
数据规模和约定
  输入字符串长度最长为200。
解题思路:参考自https://www.cnblogs.com/ZhengLijie/p/12511219.html
只有n=5的情况有点难度,日常眼高手低一写就错。
需要注意几点:
1:加‘-’的地方不止一处,所以就需要遍历字符串。
2:定义一个空字符串用于存储答案,遇到连续就赋值'-',否则就赋值是s[i]即可(这一步有细节需要注意)。同时还不能连续赋值'-',即上一个是'-'就不能再加一个'-'。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main() {
 4     int n;
 5     string s;
 6     cin >> n >> s;
 7     if (n == 1) {
 8         for (int i = 0; i < s.length(); i++) {
 9             if (s[i] >= 'a' && s[i] <= 'z') {
10                 s[i] -= 32;
11             }
12         }
13         cout << s << endl;
14     } else if (n == 2) {
15         for (int i = 0; i < s.length(); i++) {
16             if (s[i] >= 'A' && s[i] <= 'Z') {
17                 s[i] += 32;
18             }
19         }
20         cout << s << endl;
21     } else if (n == 3) {
22         reverse(s.begin(), s.end());
23         cout << s << endl;
24     } else if (n == 4) {
25         for (int i = 0; i < s.length(); i++) {
26             if (s[i] >= 'A' && s[i] <= 'Z') {
27                 s[i] += 32;
28             } else if (s[i] >= 'a' && s[i] <= 'z') {
29                 s[i] -= 32;
30             }
31         }
32         cout << s << endl;
33     } else { //n=5的情况,难点 
34         for (int i = 0; i < s.length(); i++) {  
35             if (s[i] >= 'A' && s[i] <= 'Z') {
36                 s[i] += 32;
37             }
38         }
39         string ans = ""; //存储答案 
40         for (int i = 0; i < s.length(); i++) { //遍历字符串
41             if (i == 0) { //如果是第一个 
42                 ans += s[0];
43             } else if (i != s.length() - 1) { //如果不是最后一个 
44                 if (s[i] == s[i - 1] + 1) { //如果这一位和前一位连续 
45                     if (s[i] + 1!= s[i + 1]) { //如果这一位和这一位的后一位不连续 ,重点重点 
46                         ans += s[i];
47                     } else if (ans[ans.length() - 1] != '-') { //如果ans上一位不是'-',才加上'-',即不会有--的情况 
48                         ans += '-';    
49                     } else {
50                         continue;
51                     }
52                 } else { //如果这一位和前一位不连续
53                     ans += s[i]; //把这一位加入ans 
54                 }
55             } else { //如果是最后一个 
56                 ans += s[i];
57             }
58         }
59         cout << ans << endl; //输出答案 
60     }
61     return 0;
62 }
原文地址:https://www.cnblogs.com/fx1998/p/12650003.html