题解 | 字符串排序
字符串排序
https://www.nowcoder.com/practice/5190a1db6f4f4ddb92fd9c365c944584?tpId=37&tqId=21249&rp=1&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
string s;
getline(cin, s);
// 提取所有字母字符及其原始位置
vector<pair<char, int>> letters;
for (int i = 0; i < s.length(); i++) {
if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')) {
letters.push_back({s[i], i});
}
}
// 自定义排序规则
sort(letters.begin(), letters.end(), [](const pair<char, int>& a, const pair<char, int>& b) {
char lower_a = tolower(a.first);
char lower_b = tolower(b.first);
if (lower_a == lower_b) {
// 同一字母的大小写按输入顺序排列
return a.second < b.second;
}
// 按字母表顺序排序(不区分大小写)
return lower_a < lower_b;
});
// 将排序后的字母放回原字符串
int letterIndex = 0;
for (int i = 0; i < s.length(); i++) {
if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')) {
s[i] = letters[letterIndex++].first;
}
}
cout << s << endl;
return 0;
}
// 64 位输出请用 printf("%lld")