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;
}

第一次错误

就栽在那个“字母-数字”上