ZeroJudge C635: 基礎排序 #1-2 (位置排序)

有若干行測資。
每一行測資有 10 至 20 個用逗號分隔的數字。
請「分別對數列中奇數位置及偶數位置的數字加以排序」,並將結果輸出。

範例測資

範例輸入範例輸出
EOF 輸入,每一行測資有 10 至 20 個用逗號分隔的數字 N (1 <= N <= 100000)。分別對數列中奇數位置及偶數位置的數字加以排序,並將結果輸出。
4806,39740,87462,16241,69980,93315,67864806,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

發佈留言