1.題目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
編寫一個程式,將輸入字串中的字元按如下規則排序(一個測試用例可能包含多組資料,請注意處理)。
規則 1 :英文字母從 A 到 Z 排列,不區分大小寫。
如,輸入: Type 輸出: epTy
規則 2 :同一個英文字母的大小寫同時存在時,按照輸入順序排列。
如,輸入: BabA 輸出: aABb
規則 3 :非英文字母的其它字元保持原來的位置。
如,輸入: By?e 輸出: Be?y
樣例:
輸入:
A Famous Saying: Much Ado About Nothing(2012/8).
輸出:
A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).
輸入輸出格式
輸入描述:
輸出描述:
輸入輸出樣例
輸入樣例#:
A Famous Saying: Much Ado About Nothing (2012/8).
輸出樣例#:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
題目來源
北京大學機試題
2.題解
2.1 字串重組 + Lambda表示式
思路
這裡嘗試了一下Lambda表示式的使用 和 copy_if 這個函式的使用
copy_if(xx_old.begin(), xx_old.end(), back_inserter(xx_new), 函式物件/Lambda表示式(表示複製條件));
這裡為何不再想copy函式一樣提供一個xx_new.begin()就可以了呢?因為這裡有複製條件,就導致了新陣列的長度不定,不像copy中長度固定,直接resize即可
所以這裡建立一個可以將元素插入到容器末尾的迭代器back_inserter,可以動態擴容!
這裡剛開始希望在一個compare函式內解決,然後發現保留非字母符號原來位置比較困難,所以選擇將字母提取出來單獨處理
再利用下標關係,修改陣列input為output,重建字串
程式碼
#include<bits/stdc++.h>
using namespace std;
bool compare(char a, char b){
// 如果是英文字母,不區分大小寫,按照 A 到 Z 排序
if (isalpha(a) && isalpha(b)) {
return tolower(a) < tolower(b);
}
return false;
}
int main(){
string input;
getline(cin, input);
vector<char> letters;
// 第三個引數指的是 建立一個可以將元素插入到容器末尾的迭代器
copy_if(input.begin(), input.end(), back_inserter(letters), [](char c){
return isalpha(c);
});
// stable_sort(letters.begin(), letters.end(), compare);
// 所有字母進行排序
stable_sort(letters.begin(), letters.end(), [](char a, char b){
return tolower(a) < tolower(b);
});
// 重組字串
int cnt = 0;
string output;
for(char ch : input){
if(isalpha(ch)){
output.push_back(letters[cnt++]);
}else{
output.push_back(ch);
}
}
cout << output;
return 0;
}