網易筆試編程-兩種排序方法

題目描述:
考拉有n個字符串字符串,任意兩個字符串長度都是不同的。考拉最近學習到有兩種字符串的排序方法: 1.根據字符串的字典序排序。例如:
“car” < “carriage” < “cats” < “doggies < “koala”
2.根據字符串的長度排序。例如:
“car” < “cats” < “koala” < “doggies” < “carriage”
考拉想知道自己的這些字符串排列順序是否滿足這兩種排序方法,考拉要忙着吃樹葉,所以需要你來幫忙驗證。
輸入描述:
輸入第一行爲字符串個數n(n ≤ 100)
接下來的n行,每行一個字符串,字符串長度均小於100,均由小寫字母組成
輸出描述:
如果這些字符串是根據字典序排列而不是根據長度排列輸出”lexicographically”,
如果根據長度排列而不是字典序排列輸出”lengths”,
如果兩種方式都符合輸出”both”,否則輸出”none”
輸入例子:
3
a
aa
bbb
輸出例子:
both
算法分析:
分別編寫判斷字典排序和長度排序的函數。在主函數中,分別調用這兩個函數來判斷該組字符串,通過返回值的不同情況,給出結果。
定義兩個函數isLex()和isLen()分別來判斷字符串組是否是字典序和長度序。
字典序的判斷辦法是:依次從字符串組中取出相鄰的兩個字符串,定義一個下標i,從前到後掃描字符串(兩個字符串長度中較小的一個作爲i的最大長度),判斷連個字符串在i位置的字符大小,如果字符串A在i位置的字符大於字符串B,則該兩個字符串是字典序,如果字符串A在i位置的字符小於字符串B,則該兩個字符串不是字典序,如果字符串A在i位置的字符等於字符串B在i位置的字符,i自加1,再次判斷下一個字符,如果i超過它的最大長度,則說明字符串A的前i個字符與字符串B的前i個字符相同,此時,比較字符串A的長度是否小於字符串B,如果小於,是字典序,否則不是字典序。
長度序的判斷方法相比於字典序則簡單的多:依次從字符串組中取出相鄰的兩個字符串,利用.size()函數得到這兩個字符串的長度,如果前者的字符串長度小於等於後者,則繼續便利字符串組,若大於後者,則遍歷終止,返回flag值。
然後再main函數中,分四種情況對isLex()和 isLen()函數的返回值進行討論,輸出結果即可。

#include <iostream>
#include <string>
#include <vector>

using namespace std;

bool isLexi(vector<string> vecStr);
bool isLen(vector<string> vecStr);
bool comStr(string, string);
int main(void)
{
    int n;
    cin >> n;
    vector<string> vecStr;
    bool flagLexi = false, flagLen = false;
    while(n--)
    {
        string temp;
        cin >> temp;
        vecStr.push_back(temp);
    }
    flagLexi = isLexi(vecStr);
    flagLen  = isLen(vecStr);
    if ( true == flagLexi && true == flagLen)
    {
        cout << "both" << endl;;
    }
    else if ( true == flagLexi)
    {
        cout << "lexicographically" << endl;
    }
    else if ( true == flagLen )
    {
        cout << "lengths" << endl;
    }
    else
    {
        cout << "none" << endl;
    }
    return 0;
}


bool isLexi(vector<string> vecStr)
{
    bool flag = true;
    if (vecStr.empty())
        return flag;
    for (unsigned int i = 0; i < vecStr.size() - 1; ++i)
    {
        if ( true == comStr(vecStr[i], vecStr[i+1]))
        {
            flag = true;
        }
        else
        {
            flag = false;
            break;
        }
    }
    return flag;
}

bool isLen(vector<string> vecStr)
{
    bool flag = true;
    if (vecStr.empty())
        return flag;
    for (unsigned int i = 0; i < vecStr.size() - 1; ++i)
    {
        if (vecStr[i].size() <= vecStr[i+1].size())
        {
            flag = true;
        }
        else
        {
            flag = false;
            break;
        }
    }
    return flag;
}

bool comStr(string first, string second)
{
    bool flag = true;
    if (first.empty() && second.empty())
        return true;
    if (first.empty())
        return false;
    if (second.empty())
        return true;
    unsigned int i;
    for (i = 0; i < first.size() && i < second.size();)
    {
        if (first[i] == second[i])
        {
            flag = true;
            i++;
        }
        else if (first[i] < second[i])
        {
            flag = true;
            break;
        }
        else
        {
            flag = false;
            break;
        }
    }
    if (i == first.size() || i == second.size())
    {
        if ( first.size() <= second.size())
        {
            flag = true;
        }
        else
        {
            flag = false;    
        }
    }
    return flag;
}

若有不對之處,敬請指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章