有若干行測資。
每一行測資有 10 至 20 個用逗號分隔的數字。
請「分別對數列中奇數位置及偶數位置的數字加以排序」,並將結果輸出。
範例測資
範例輸入 | 範例輸出 |
---|---|
EOF 輸入,每一行測資有 10 至 20 個用逗號分隔的數字 N (1 <= N <= 100000)。 | 分別對數列中奇數位置及偶數位置的數字加以排序,並將結果輸出。 |
4806,39740,87462,16241,69980,93315,6786 | 4806,16241,6786,39740,69980,93315,87462 |
解題思路
使用字串先將整筆輸入收起來,再來將字串切割成數字,並依序依照其位置放數奇數或偶數的陣列中。
將兩個陣列排序過後,跑 For迴圈 將兩個陣列中的資料輪流輸出。
範例程式碼-ZeroJudge C635: 基礎排序 #1-2 (位置排序)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int toint(const string& str) {
if (str.length() == 1) return str[0] - '0';
return stoi(str);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
string str;
while (cin >> str) {
string tmp = "";
vector<int>odd, even;
int count = 1;
for (int i = 0; i<str.length(); i++) {
if (str[i] == ',' && !tmp.empty()) {
if (count % 2 == 0) even.push_back(toint(tmp));
else odd.push_back(toint(tmp));
count++;
tmp = "";
continue;
}
tmp += str[i];
}
if (!tmp.empty()) {
if (count % 2 == 0) even.push_back(toint(tmp));
else odd.push_back(toint(tmp));
}
sort(odd.begin(), odd.end());
sort(even.begin(), even.end());
int o = 0, e = 0;
for (int i = 0; i<count; i++) {
if (i % 2 == 0) {
cout << odd[o];
o++;
}
else {
cout << even[e];
e++;
}
if (i != count-1) cout << ",";
}
cout << "\n";
}
}
//ZeroJudge C635
//Dr. SeanXD