題目敘述
每筆測資第一行有一個正整數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";
}
}
}
留言
張貼留言