1.题目

【HJ26】字符串排序(字符处理、排序)_i++

2.思路

注意处理要求:
(1)并不是简单的单词排序,而是将字母排序同时,如果存在(多个)大小写字母需要按照输入的顺序排列;
——要实现(1)即首先要将“相同字母”的大小写顺序保存,在遍历的时候遇到该“相同字符”就压入该字符所在的​​​string​​​型字符串中;
然后将已排序好的26个字母​​​string​​依次拼接起来,得到排序好的字母串。

(2)非字母的字符所在的下标位置不能改变。
——这步处理是关键,在覆盖的过程中将指向非字母字符的指针下移一格,即不用覆盖;对于字母部分才继续进行覆盖。

3.代码

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
vector<string>vec(26);//26个字母
for(int i=0;i<str.size();i++){
if(str[i]>='A' && str[i]<='Z'){
vec[str[i]-'A'].push_back(str[i]);
}else if(str[i]>='a' && str[i]<='z'){
vec[str[i]-'a'].push_back(str[i]);
}
}
//拼接所有字母字符
string ans;
for(int i=0;i<26;i++){
ans+=vec[i];//仅含有字母(大小写字母)
}
int pos=0;
for(int i=0;i<str.size();i++){
if((str[i]>='A' && str[i]<='Z')||(str[i]>='a' && str[i]<='z')){
//若为大小写字母
str[i]=ans[pos];
pos++;//重点
}
}
//输出
cout<<str<<endl;
}
return 0;
}