刚才在群里看别人发了一个题目
这是一道排序+字符串处理的题目,难度属于PAT乙级,五题中的第三题。
分析:字典序就是字符串在字典中的顺序。例如,
1。“A”的字典序小于“a”;
2。"a"的字典序小于”b“;
3。”aa“的字典序小于”aaaa“
4。"aaaa"的字典序小于”aab“的字典序,这里从最高位,一个字符一个字符的比较。
5。“Aa”的字典序小于"aa"
#include<iostream> #include<algorithm> using namespace std; bool cmp(string a,string b) { //计算单词ASCII值,并转小写单词 int sum1 = 0,sum2 = 0; for(int i = 0 ; i < a.size(); ++i) { sum1 += a[i]; a[i] = tolower(a[i]); } for(int i = 0 ; i < b.size(); ++i) { sum2 += b[i]; b[i] = tolower(b[i]); } if(a != b) return a < b;//比较小写单词 else return sum1 < sum2;//单词一样,就比较ASCII值 } int main() { int n; string str[100]; cin>>n; for(int i = 0; i < n; ++i)//输入n个 单词 cin>>str[i]; sort(str,str+n,cmp);//根据转换成小写单词后的字典序,原单词的 ASCII码,对单词排序 for(int i = 0; i < n;++i){ if(i > 0) printf(" "); cout<<str[i]; } return 0; }
运行结果:
刚才发这道题的人说,如果小写单词一样,要按输入先后 排序。于是,我把代码改了一下,如下所示。
#include<iostream> #include<algorithm> using namespace std; const int maxn = 10000; struct Sstring { string str; int RANK = maxn;//记录输入先后顺序 } sstr[maxn]; bool cmp(Sstring a,Sstring b) { //全部转换成小写单词 for(int i = 0 ; i < a.str.size(); ++i) { a.str[i] = tolower(a.str[i]); } for(int i = 0 ; i < b.str.size(); ++i) { b.str[i] = tolower(b.str[i]); } if(a.str != b.str) return a.str < b.str;//比较小写单词 else return a.RANK < b.RANK;//单词一样,就按输入先后顺序排序 } int main() { int n; cin>>n; for(int i = 0; i < n; ++i) { cin>>sstr[i].str; sstr[i].RANK = i;//记录输入先后顺序 } sort(sstr,sstr+n,cmp); for(int i = 0; i < n; ++i) { if(i > 0) printf(" "); cout<<sstr[i].str; } return 0; }
运行结果: