DreamJu-1255-字符串排序2
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;
}