https://ac.nowcoder.com/acm/contest/20960/[链接1001](url)
小白正式在牛客系统刷题第一天,希望能在此记录自己的成长
主要思路 :
要不要插(由“-”即其两侧字符决定)------->插入什么(不考虑重复,由p1决定)--------->插入多少(考虑重复,由p2决定)------->要不要倒置(由p3决定)
易错点:(其实这题思路不难,但要考虑周全也不容易)
注意点一:先判断要不要插,注意这里很容易翻车,特别是这句“出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符”,一开始想当然认为减号两边要么是字母,要么是数字,忽视了可能“字母-数字”,这样光用下面判断会出错
应该这样写
if(isalpha(str[i -1]) && isalpha(str[i + 1]) && str[i - 1] < str[i + 1] //判断两边是不是都是字母
|| isdigit(str[i - 1]) && isdigit(str[i + 1]) && str[i - 1] < str[i + 1]) //判断两边是不是都是数字
注意点二:处理插入时,将插入的字符串单独处理,这样可以方便处理倒置
完整代码如下
#include <iostream>
#include <algorithm>
using namespace std;
string fun(int p1, int p2, int p3, const string str) { //const修饰防止修改字符串str
string ret = "";
for(int i = 0; i < str.length(); i++) {
if(str[i] == '-') { //发现可能插入点
if(isalpha(str[i -1]) && isalpha(str[i + 1]) && str[i - 1] < str[i + 1] //两侧都是字母
|| isdigit(str[i - 1]) && isdigit(str[i + 1]) && str[i - 1] < str[i + 1]) { //两侧都是数字
string insert = "";
for(char ch = (str[i - 1] + 1); ch < str[i + 1]; ch++) { //利用两重循环处理p2
for(int j = 1; j <= p2; j++) {
if(p1 == 1)
insert += tolower(ch);
else if(p1 == 2)
insert += toupper(ch);
else if(p1 == 3)
insert += '*';
}
}
if(p3 == 2)
reverse(insert.begin(), insert.end());
ret += insert;
}
else //针对“字母-数字”型,“str[i - 1]>str[i + 1]”
ret += str[i];
}
else { //针对常规
ret += str[i];
}
}
return ret;
}
int main() {
int p1, p2, p3;
cin >> p1 >> p2 >> p3;
string str;
cin >> str;
string ret = fun(p1, p2, p3, str);
cout << ret << endl;
return 0;
}
第一次错误
就栽在那个“字母-数字”上