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 嘤嘤嘤,没过审,然后管理看完真的降橙了,还关了通道
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通