题目:
按照以下规则排序:
方法一:
稳定排序
思路:将原字符串的所有英文字母按忽略大小写进行稳定排序。稳定排序的含义:相同字母按输入顺序排序。
最后,与原字符串比较,如果是英文字母,则将排过序的字母数组赋值替换。
#include <bits/stdc++.h>
using namespace std;
bool cmp(char x,char y) {//忽略大小写的排序
if(x>='a')
x-=32;
if(y>='a')
y-=32;
return x<y;
}
int main(){
string s;
while(getline(cin,s)){//输入整行
vector<char> v;
int len=s.size();
for(int i=0;i<len;i++){//遍历,存储英文字母
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){
v.push_back(s[i]);
}
}
stable_sort(v.begin(),v.end(),cmp);//稳定排序
int j=0;
for(int i=0;i<len;i++){//遍历
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){//如果是英文字母,则将排过序的字母数组赋值替换
s[i]=v[j++];
}
}
cout << s << endl;
}
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
map
思路:map有排序的功能,用map存储英文字符和字符的位置。因为不区分英文字母大小写,所以先统一将小写字母变为大写字母,并将键值对的值置为1,表示修改过的标志。
最后遍历原字符串,如果是英文字母并且键值对的值为1,说明修改过,那么要将大写字母还原为小写字母。
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
map<pair<char,int>,int> m;//map存储英文字符和字符的位置
while(getline(cin,s)){//输入整行
m.clear();
int len=s.size();
for(int i=0;i<len;i++){
if(s[i]>='a'&&s[i]<='z'){//统一将小写字母变为大写字母,并将键值对的值置为1,表示修改过的标志
m[{s[i]-32,i}]=1;
}else if(s[i]>='A'&&s[i]<='Z'){
m[{s[i],i}]=0;
}
}
map<pair<char,int>,int>::iterator it=m.begin();
for(int i=0;i<len;i++){//遍历
if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')){//如果是英文字母
if(it->second==1)//键值对的值为1,说明修改过,那么要将大写字母还原为小写字母,因此+32
s[i]=it->first.first+32;
else
s[i]=it->first.first;
it++;
}
}
cout << s << endl;
}
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号