ZeroJudge N327: The Tower of Names

題目敘述

每筆測資第一行有一個正整數N,接下來會有N行,每行會有一個包含空格的字串,代表一個人名。要求將所有字串依長度由短到長進行排序後輸出,如果有長度一樣的字串,則使用字母順序做排序。


範例輸入 #1

5

Alexander Smith

Mia Johnson

Benjamin Lee

Isabella Chang

Oliver Taylor

範例輸出 #1

Mia Johnson

Benjamin Lee

Oliver Taylor

Isabella Chang

Alexander Smith


範例輸入 #2

4

Ethan Baker

April Adams

Jacob White

Emily Clark

範例輸出 #2

April Adams

Emily Clark

Ethan Baker

Jacob White


解題思路

將N進行輸入後要先進行一次無用的getline,這樣之後的getline才會都收得到資料。可以使用Map<int, vector<string>>來紀錄每一個長度的字串,將新的字串加入Vector之後再使用Sort來做字母排序。輸出時可以使用Auto來跑Map的For迴圈,這樣只會跑到已經有設定資料的Map值,再把Vector中的字串輸出即可。

解題程式碼如下 (僅供參考):

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int main() {
    int N;
    cin >> N;
    string s;
    getline(cin, s);
    map<int, vector<string>>MAP;
    for (int i = 0; i<N; i++)
    {
        string str;
        getline(cin, str);
        vector<string>tmp;
        int len = int(str.length());
        tmp.assign(MAP[len].begin(), MAP[len].end());
        tmp.push_back(str);
        sort(tmp.begin(), tmp.end());
        MAP[len].clear();
        MAP[len].assign(tmp.begin(), tmp.end());
    }
    for (auto it:MAP)
    {
        vector<string>tmp = it.second;
        for (int i = 0; i<tmp.size(); i++)
        {
            cout << tmp[i] << "\n";
        }
    }
}

留言