刚才在群里看别人发了一个题目

 这是一道排序+字符串处理的题目,难度属于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;
}

运行结果:

 

posted @ 2020-02-24 11:53  tangq123  阅读(152)  评论(0编辑  收藏  举报