题解 | 字符串排序——很简单,只需两个简单步骤

字符串排序

https://www.nowcoder.com/practice/d9aa3894d3aa4887843a85d26daa4437?tpId=40&tags=&title=&difficulty=0&judgeStatus=0&rp=1&sourceUrl=

题目给出了三个要求

1、前两个规则 只需要对字母进行稳定排序即可。

sort()本身不稳定,要实现稳定排序只需要加一个order来记录字母输入的顺序即可,当字母比对相同,按照order来排序即可。

为了实现方便,不妨定义一个结构体,把字母letter和顺序order放一起,如下所示:

//结构体
struct word {
    char letter;
    int order;
    word(char l, int o): letter(l), order(o) {};
};
//排序算法
bool myCompare(const word& a, const word& b) {
    if (tolower(a.letter) == tolower(b.letter)) {
        return a.order < b.order;
    }
    return tolower(a.letter) < tolower(b.letter);
}

2、第三个规则,要求非字母保持原有顺序不变,似乎有点麻烦,但也好处理;

考虑到字母需要排序,我们可以把字母摘出来放到一个vector中,这样就把字母和非字母区分开了。

具体实现方法:定义string类型变量input,用getline(cin,input)获取输入后,遍历input,把里面的字母都摘出来放入一个新的vector中,把字母排序完成后再插入input中即可。

完整代码如下,逻辑很简单:

#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

struct word {
    char letter;
    int order;
    word(char l, int o): letter(l), order(o) {};
};

bool myCompare(const word& a, const word& b) {
    if (tolower(a.letter) == tolower(b.letter)) {
        return a.order < b.order;
    }
    return tolower(a.letter) < tolower(b.letter);
}

int main() {
    string input; //存储所有输入数据
    vector<word>words; //只存储输入数据中的字母
    while (getline(cin, input)) {
        words.clear();
        for (int i = 0; i < input.size(); i++) {
            if (isalpha(input[i]) ) { //如果是字母,摘出来放入words中
                words.emplace_back(input[i], i);
            }
        }
        sort(words.begin(), words.end(), myCompare);//排序
        for (int i = 0, j = 0; i < input.size(); i++) { //i和j分别遍历input和words
            if (isalpha(input[i])) {
                    input[i] = words[j++].letter;
            }
        }
        cout << input << endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

自由水:这HR已经很好了,多的是已读不回和不读了
点赞 评论 收藏
分享
那么好了好了:他本来公司就是做这个的,不就是正常的游戏客户端和服务器开发,软硬件联动,有啥恶心不恶心的,提前告诉你就是怕你接受不了,接受不了就没必要再往后走流程浪费时间,虽然这公司是一坨。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务