题目描述

给定n个字符串,请对n个字符串按照字典序排列。

原来思路是想用sort函数,然后重写下里面的比较函数

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
static bool cmp(string a,string b){//注意加static
    int min=(a.size()<b.size()?a.size():b.size());
    for(int i=0;i<min;i++){
        if(a[i]<b[i]) return true;//字母小的排前面
        if(a[i]>b[i]) return false;
    }
    return min==a.size()?true:false;//前述字母相同时,短的排前面
}
int main(){
    int num;cin>>num;
    string s;
    vector<string> ans;
    for(int i=0;i<num;i++){
        cin>>s;//读取每行输入的字符串
        ans.push_back(s);//放到vector中
    }
    sort(ans.begin(),ans.end(),cmp);//重写cmp
    for(auto i:ans)
        cout<<i<<endl;
    return 0;
}

然而... 在解题里看到有人:

static bool cmp(string a,string b){
    return a<b;//字符串自带的比较功能,就是字典序
}

再然后,发现sort本来默认就是从小到大的,所以根本不需要重写cmp

sort(ans.begin(),ans.end());//直接调用,AC

嗯..记住了
(自从对面的同学说笔试用sort很正常后,我的排序题就放飞了)

看到另一种,完全版的字典序是大小写都有规则的,因为sort是按ascii码,会先排大写A-Z再排小写a-z,所以需要判断。思路:查表?把每个字母对应一个数字,表示大小,比如A-1,a-2,B-3,b-4....(大写在前面) 然后重写cmp函数...