题目:
按照以下规则排序:
方法一:
稳定排序
思路:将原字符串的所有英文字母按忽略大小写进行稳定排序。稳定排序的含义:相同字母按输入顺序排序。
最后,与原字符串比较,如果是英文字母,则将排过序的字母数组赋值替换。
#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; }
时间复杂度:空间复杂度: