字符串的展开
字符串的展开
https://ac.nowcoder.com/acm/problem/16644
WriteUp:
输入
- 可以用字符数组,末尾判断根据下一项是否为'/0'来判断。
- 用字符串,可以获取到字符串的长度。
输出
- 可以用额外的数组标记'-',和其他需要插入的地方,但比较麻烦。
- 直接在遍历的时候输出。(较方便)
细节
- 字符要用单引号。
- 获取字符串长度"s.length()"
#include<bits/stdc++.h>
using namespace std;
const int M = 100000;
string s;
void p(int p1, int p2, int p3, int i) {
switch(p1) {
case 1:
//小写输出
if(p3 == 1) {
//顺序输出
for(int j = (int)(s.at(i-1) + 1); j <= (int)(s.at(i+1) - 1); j++) {
//输出k个
for(int k = 1; k <= p2; k++) {
cout<<(char)(j);
}
}
} else {
//逆序输出
for(int j = (int)(s.at(i+1) - 1); j >= (int)(s.at(i-1) + 1); j--) {
for(int k = 1; k <= p2; k++) {
cout<<(char)(j);
}
}
}
break;
case 2:
//大写输出
if(p3 == 1) {
//顺序输出
if(s.at(i - 1) >= 'a' && s.at(i - 1) <= 'z') {
//需要变大写
for(int j = (int)(s.at(i-1) + 1 - (int)('a' - 'A')); j <= (int)(s.at(i+1) - 1 - (int)('a' - 'A')); j++) {
//输出k个
for(int k = 1; k <= p2; k++) {
cout<<(char)(j);
}
}
} else {
for(int j = (int)(s.at(i-1) + 1); j <= (int)(s.at(i+1) - 1); j++) {
for(int k = 1; k <= p2; k++) {
cout<<(char)(j);
}
}
}
} else {
//逆序输出
if(s.at(i - 1) >= 'a' && s.at(i - 1) <= 'z') {
//需要变大写
for(int j = (int)(s.at(i+1) - 1 - (int)('a' - 'A')); j >= (int)(s.at(i-1) + 1 - (int)('a' - 'A')); j--) {
for(int k = 1; k <= p2; k++) {
cout<<(char)(j);
}
}
} else {
for(int j = (int)(s.at(i+1) - 1); j >= (int)(s.at(i-1) + 1); j--) {
for(int k = 1; k <= p2; k++) {
cout<<(char)(j);
}
}
}
}
break;
case 3:
//输出*,顺序和逆序不重要了,重要是p2
for(int j = (int)(s.at(i-1) + 1); j <= (int)(s.at(i+1) - 1); j++) {
//输出k个
for(int k = 1; k <= p2; k++) {
cout<<'*';
}
}
break;
}
}
int main() {
int p1,p2,p3;
cin>>p1>>p2>>p3;
cin>>s;
for(int i = 0; i < s.length(); i++) {
//'-'在第一个,'-'在最后一个,会越界
if(s.at(i) == '-' && (i == s.length() - 1 || i == 0)) {
cout<<'-';
} else {
//多个连续'-'
if(s.at(i) == '-' && (s.at(i-1) >= 'a' && s.at(i-1) <= 'z' || s.at(i-1) >= '0' && s.at(i-1) <= '9') && (s.at(i+1) >= 'a' && s.at(i+1) <= 'z'|| s.at(i+1) >= '0' && s.at(i+1) <= '9') && s.at(i-1) < s.at(i+1)) {
//只删除-
if(s.at(i-1) == char(s.at(i+1) - 1)) continue;
//要替换字符串
//前者比后者大(做题时缺少该部分)
if(s.at(i-1) > s.at(i+1)) {
cout<<'-';
continue;
}
//判断是否同为一种类型
if((s.at(i-1) >= 'a' && s.at(i-1) <= 'z') && (s.at(i+1) >= 'a' && s.at(i+1) <= 'z')) {
p(p1,p2,p3,i);
i++;
} else if((s.at(i-1) >= '0' && s.at(i-1) <= '9') && (s.at(i+1) >= '0' && s.at(i+1) <= '9')) {
p(p1,p2,p3,i);
i++;
}
}
cout<<s.at(i);
}
}
}