字符串的展开 题解
2023-08-22 19:32:08
发布于:广东
55阅读
0回复
0点赞
看着很复杂的一道模拟题,虽然写起来确实不怎么复杂,但细节还是比较多的.
主要分析的就是-的处理情况,总体上就是展开和不展开(直接输出)的判断.
需要展开的情况:
前后有字符,且均为字母或数字
字符后者-前者的ascii值>=1
(=1时仍然是展开,但什么都不输出.我是用了个特判,但想想好像也不需要)
那么不展开的情况就是非上述情况了.包括首尾,前后不为相同类型,甚至还有一堆-
相连的一个测试点
我还纳闷为啥还有90分这种情况
总体上还是判断写的太渣了,但我又懒得改,开摆!
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
int p1,p2,p3;
cin >> p1 >> p2 >> p3 >> s;
for(int i = 0 ; i < s.size() ; i++)
{
//其他字符和首尾的-不作处理正常输出
if(s[i] != '-' || !i || i == s.size() - 1 || s[i - 1] == '-' || s[i + 1] == '-')
{
cout << s[i];
continue;
}
//判断左右两侧字符的情况
//满足展开条件进行展开
if(s[i + 1] - s[i - 1] >= 1 && ((s[i + 1] > 64 && s[i - 1] > 64) || (s[i + 1] < 65 && s[i - 1] < 65)))
{
//特判后继
if(s[i + 1] - s[i - 1] == 1)
continue;
//是否逆序
if(p3 == 1)
{
int l = s[i - 1],r = s[i + 1];
while(++l != r)
{
//填充个数
for(int j = 0 ; j < p2 ; j++)
{
//p1==3统一输出*
if(p1 == 3)
cout << '*';
//字符考虑大小写,因为母串均为小写字母所以好些一些
else if(l > 64)
{
if(p1 == 1)
printf("%c",l);
else
printf("%c",l - 32);
}
//数字直接填充
else
printf("%c",l);
}
}
}
else
{
int r = s[i - 1],l = s[i + 1];
while(--l != r)
{
//填充个数
for(int j = 0 ; j < p2 ; j++)
{
//p1==3统一输出*
if(p1 == 3)
cout << '*';
//字符考虑大小写,因为母串均为小写字母所以好些一些
else if(l > 64)
{
if(p1 == 1)
printf("%c",l);
else
printf("%c",l - 32);
}
//数字直接填充
else
printf("%c",l);
}
}
}
}
//不满足展开条件,非后继输出-,后继不输出
else
cout << s[i];
}
return 0;
}
这里空空如也
有帮助,赞一个