AT_past201912_f DoubleCamelCase Sort

思路

First

由于需要将所有单词排序,我们首先需要截取出所有单词。

如果遇到大写字母,使用一个指针向后扫,直到遇到下一个大写字母。而这一段子串,就是一个单词。

Second

接下来,我们需要给单词排序。

注意:这里的字符串忽略大小写排序!

所以,我们需要自己写一个cmp改变排序规则:

bool cmp(string a,string b){
    For(i,0,min(a.size(),b.size()) - 1){
        int x = (a[i] >= 'A' && a[i] <= 'Z') ? a[i] - 'A':a[i] - 'a';
        int y = (b[i] >= 'A' && b[i] <= 'Z') ? b[i] - 'A':b[i] - 'a';//转化数字
        if(x != y){
            return x < y;
        }
    }
    return a.size() < b.size();//如果前面部分全部都相等,长度短的字典序更小
}

再进行排序即可。

完整代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

#define int long long
#define M 100005

#define For(i,j,k) for(int i = j;i <= k;i ++)
#define Rep(i,j,k) for(int i = j;i >= k;i --)
#define mem(a,b) memset(a,b,sizeof a)
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0)

int i,cnt;
string s,p,ans[M];

bool cmp(string a,string b){
    For(i,0,min(a.size(),b.size()) - 1){
        int x = (a[i] >= 'A' && a[i] <= 'Z') ? a[i] - 'A':a[i] - 'a';
        int y = (b[i] >= 'A' && b[i] <= 'Z') ? b[i] - 'A':b[i] - 'a';
        if(x != y){
            return x < y;
        }
    }
    return a.size() < b.size();
}

signed main(){
    IOS;
    cin >> s;
    p = s;
    while(i < (int)s.size()){
        if(s[i] <= 'Z' && s[i] >= 'A'){
            int st = i;
            i ++;
            while(s[i] <= 'z' && s[i] >= 'a' ){
                i ++;
            }
            int len = i - st + 1;
            ans[++cnt] = p.substr(st,len);
        }
        i ++;
    }
    sort(ans + 1,ans + 1 + cnt,cmp);
    For(i,1,cnt) cout << ans[i];
    return 0;
}

总结

这是一道不错的练习排序的题目,虽然感觉不足黄题

updata 2023.7.22 嘤嘤嘤,没过审,然后管理看完真的降橙了,还关了通道

posted @ 2023-08-12 08:44  固态H2O  阅读(2)  评论(0编辑  收藏  举报  来源