当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:[NK]:两种排序方法

    Scissors_初夏的博客:初夏小谈:[NK]:两种排序方法

    作者:[db:作者] 时间:2021-08-16 12:56

    题目描述

    考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
    "car" < "carriage" < "cats" < "doggies < "koala"
    2.根据字符串的长度排序。例如:
    "car" < "cats" < "koala" < "doggies" < "carriage"
    考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

    输入描述:

    输入第一行为字符串个数n(n ≤ 100)
    接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成

    输出描述:

    如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically",
    
    如果根据长度排列而不是字典序排列输出"lengths",
    
    如果两种方式都符合输出"both",否则输出"none"

    示例1

    输入

    3
    a
    aa
    bbb

    输出

    both

    解题思路:

    根据题意,就是判断出来长度是否符合条件和所有字符串符合字典序。并且对这两种情况的不同组合进行分别打印不同的语句。

    长度的排序比较简单,就是一一比较相邻的字符串长度,发现一个不符合就不符合长度排序。

    对于字典序,像查字典一样,先比较相邻字符串的第一个字母,三种情况:

    • 1.前一个字符串首字母小于后一个字符串首字母时直接判断下一对。
    • 2.前一个字符串首字母大于后一个字符串首字母时直接停止,不符合。
    • 3.则前一个字符串首字母等于后一个字符串首字母时,就需要接着比较两个字符串下一个字母,重复一个步骤

    实例代码:

    #include<iostream>
    using namespace std;
    #include<vector>
    #include<string>
    
    void Dispose(vector<string>& v)
    {
        int LengthFlag = 0;
        int ZiDianXuFlag = 0;
        int size = v.size();
        if(v.size() == 1)
        {
            cout<<"both"<<endl;
            return;
        }
        for(int i = 0; i < size - 1; i++)
        {
            if(v[i].size() > v[i+1].size())
            {
                LengthFlag = 1;
                break;
            }
        }
        
        for(int i = 0; i < size - 1; i++)
        {
            int SizeStr = v[i].size();
            for(int j = 0; j < SizeStr; j++)
            {
                if(v[i][j] < v[i+1][j])
                {
                    break;
                }
                if(v[i][j] > v[i+1][j])
                {
                    ZiDianXuFlag = 1;
                    break;
                }
            }
        }
        if(ZiDianXuFlag == 0 && LengthFlag == 1)
        {
            cout<<"lexicographically"<<endl;
        }
        else if(ZiDianXuFlag == 1 && LengthFlag == 0)
        {
            cout<<"lengths"<<endl;
        }
        else if(ZiDianXuFlag == 0 && LengthFlag == 0)
        {
            cout<<"both"<<endl;
        }
        else
        {
            cout<<"none"<<endl;
        }
    }
    
    int main()
    {
        vector<string> v;
        string str;
        int count = 0;
        while(cin>>count)
        {
            for(int i = 0; i < count; i++)
            {
                cin>>str;
                v.push_back(str);
                str.clear();
            }
            Dispose(v);
        }
        return 0;
    }

    在做题中遇到的问题:

    ? ? ? ? ? 1.由于粗心在输入字符串时直接用v[i]来接收。vector都没数据空间怎么能以数组的形式存放。

    ? ? ? ? ? 2.判断字典序时,考虑不周,一开始只考虑了第三种情况。造成只通过一部分测试用例。

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 珍&源码

    cs