在英文裡,很多名字出現在一個清單時,常常會以英文字母排序 (Alphabetical Order),方便人們查找。但是文文覺得這樣長短不一的名字混雜在一起,不太整齊,於是他就先用名字的長短排序,相同長度的名字才以字母排序,如此一來,當你把這名字的清單列出來是會是上窄下寬,看起來就像是一座塔。
給你若干個名字,請以文文的方式排序後輸出。
範例測資
範例輸入 | 範例輸出 |
---|---|
輸入的第一行含有一個整數 N (0 < N <= 100),接下來有 N 行,每行含有一個由英文字母、句點 (.)、連字號 (-)、雙引號 (“)、及「空白」所組成的英文姓名。 | 將輸入的姓名先以長度 (含中間的空白及其它符號) 排序,長度相同時,則以字母順序排序。 |
5 Alexander Smith Mia Johnson Benjamin Lee Isabella Chang Oliver Taylor | Mia Johnson Benjamin Lee Oliver Taylor Isabella Chang Alexander Smith |
4 Ethan Baker April Adams Jacob White Emily Clark | April Adams Emily Clark Ethan Baker Jacob White |
解題思路
將 N 進行輸入後要先進行一次無用的 getline,這樣之後的 getline 才會都收得到資料。
宣告一個 Map<int, vector<string>>,Key 值為字串的長度, Value 值為這個長度有哪些字串。收字串的時候判斷這個字串的長度,並將這個字串 Push_Back 到 Map[字串長度] 中。
輸出時使用 for (auto it:Map),將 it.second 進行 Sort 之後再開一個 For迴圈 將 it.second (Vector<string>) 中的資料依序輸出。
範例程式碼-ZeroJudge N327: The Tower of Names
#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";
}
}
}
//ZeroJudge N327
//Dr. SeanXD