審題:
本題需要我們根據題目的要求將字符串進行擴展
思路:
方法一:模擬法一般來說題目字數和要求很多的題就是模擬題,模擬題特別需要注意的就是細節,在編寫代碼之前一定要把細節想清楚,否則很容易出錯。
分析模擬過程:
首先,題目給了我們一個字符串,這個字符串中的某些部分是需要擴展的,有些部分是不用擴展的,在這里我們就分成這兩大類
需要擴展:
(1)特殊擴展:對于'-'兩邊的字符屬于順序遞增的情況,我們就直接越過'-'接入output
(2)普通擴展:
控制插入字符:通過if語句控制字母與數字字符的插入字符
控制插入數量:通過append方法控制p2個字符插入
控制插入順序:通過reverse方法控制p3為2時的順序
不需要擴展:直接接入output字符串
解題:
#include<iostream> #include<algorithm> using namespace std; int p1, p2, p3; string input; string output; bool issametype(char a, char b) {return (islower(a) && islower(b)) || (isdigit(a) && isdigit(b)); } int main() {cin >> p1 >> p2 >> p3;cin >> input;//輸出字符串構建for (size_t i = 0; i < input.size(); i++){//擴展if (i > 0 && i < input.size() - 1 && input[i] == '-' && issametype(input[i-1],input[i+1]) && input[i+1] > input[i-1]){//特殊擴展if (input[i - 1] + 1 == input[i + 1]){continue;}string s;//確定待插入臨時串sfor (char c = input[i - 1] + 1; c < input[i + 1]; c++){char ch;//展開方式+重復個數if (p1 == 2){if (islower(c))//小寫字母單獨處理ch = toupper(c);else//數字處理ch = c;}else if (p1 == 3){ch = '*';}else{ch = c;}s.append(p2, ch); }//插入順序if (p3 == 2){reverse(s.begin(),s.end());}//插入output += s;}else //不展開{output += input[i];} }cout << output; }
注意:
1.利用庫方法isdigit判斷是否為數字字符,islower判斷是否為小寫字母。
2.判斷越界不要使用i-1,因為i是size_t類型,-1后會變成很大的正數,導致邏輯錯亂。
3.對于輸出類型部分:p1為1和3對于數字的字母都是一樣的,而p1為2就需要分開處理
4.toupper將小寫字母轉大寫,append將多個重復字符插入字符串
P1098 [NOIP 2007 提高組] 字符串的展開 - 洛谷