题目描述
编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。
规则 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).
示例1
输入
A Famous Saying: Much Ado About Nothing (2012/8).
输出
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
题目解析:就是排一下序号,不区分大小写,但是输出区分大小写,并且保持非字母的位置。只要写一个数组记录当前的字符和位置,最后再合并就可以了。具体实现看代码
代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<vector>
#include<map>
#include<iomanip>
using namespace std;
bool cmp(pair<char,int> p1,pair<char,int> p2){
if(p1.first == p2.first || p1.first - 32 == p2.first || p1.first == p2.first - 32){
return p1.second < p2.second; //字母相同,比较序号
}else{ //当字母不同时,将字母全都转化为大写,再比较
if(p1.first >= 'a' && p1.first <= 'z'){
p1.first = p1.first - 32;
}
if(p2.first >= 'a' && p2.first <= 'z'){
p2.first = p2.first - 32;
}
return p1.first < p2.first;
}
}
int main() {
string sentence;
vector<pair<char,int>> vc1,vc2; //vc1记录字母,vc2记录非字母
while(getline(cin,sentence)){
int len = sentence.size();
for(int i = 0 ; i < len ; i++){
if(int(sentence[i]) < 65 || (int(sentence[i]) > 91 && int(sentence[i]) < 97) || int(sentence[i]) > 123 ){
vc2.push_back(make_pair(sentence[i],i)); //记录非字母和它的位置
}else{
vc1.push_back(make_pair(sentence[i],i)); //记录字母和他的位置
}
}
//将字母排序
sort(vc1.begin(),vc1.end(),cmp);
//按位置插入非字母
for(int i = 0 ; i < vc2.size();i++){
vc1.insert(vc1.begin()+vc2[i].second,vc2[i]);
}
//输出合并后
for(int i = 0 ; i < vc1.size();i++){
cout << vc1[i].first;
}
cout << endl;
vc1.clear();
vc2.clear();
}
return 0;
}