题解 | 字符串排序

字符串排序

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")

全部评论

相关推荐

02-04 13:52
已编辑
山西农业大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务