題目敘述
題目採EOF方式收資料,每筆資料都有一行若干個整數用逗號隔開 (詳情請見輸入範例)。要求只將數列中的偶數進行排序並輸出,奇數維持不動 (詳情請見輸出範例)。
範例輸入
1,8,9,2,7
範例輸出
1,2,9,8,7
解題思路
使用字串將每一筆資料收進來,並且使用For迴圈來判斷每一個字元,如果目前的字元為逗號的話則將上一個逗號到這一個逗號的字串/字元塞到一個陣列/Vector中。如果這個數字為偶數的話則在把這個數字塞到原本的陣列的同時再塞到一個只有偶數的陣列/Vector中,並且要紀錄這個偶數目前在陣列中的位置,範例程式碼使用Map來紀錄。將偶數的陣列用algorithm的sort進行排序過後,跑一個原本陣列的For迴圈,當判定到目前的i是偶數的話就輸出偶數陣列的第一個資料,輸出完之後就使用erase (使用方式請見範例程式碼) 將第一個資料消除掉,如果目前的i不是偶數的話就輸出原本陣列中的資料。需要注意的是,輸出時是用逗點而不是空格隔開資料,所以最後一筆資料輸出過後不能再輸出一個逗號,這個需要做另外的判斷。
解題程式碼如下 (僅供參考):
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int toi (string str)
{
if (str.length() == 1) return int(str[0] - '0');
else return stoi(str);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
string str;
while (cin >> str)
{
int start = 0;
vector<int>num;
vector<int>even;
map<int, int>MAP;
for (int i = 0; i<str.length(); i++)
{
if (str[i] == ',')
{
int tmp = toi(str.substr(start, i));
num.push_back(tmp);
start = i+1;
if (tmp % 2 == 0)
{
even.push_back(tmp);
MAP[int(num.size()-1)] = 1;
}
}
if (i == str.length()-1)
{
int tmp = toi(str.substr(start, str.length()));
num.push_back(tmp);
if (tmp % 2 == 0)
{
even.push_back(tmp);
MAP[int(num.size()-1)] = 1;
}
}
}
sort(even.begin(), even.end());
for (int i = 0; i<num.size(); i++)
{
if (MAP[i] == 1)
{
cout << even[0];
even.erase(even.begin());
}
else cout << num[i];
if (i != num.size()-1) cout << ",";
}
cout << "\n";
}
}
留言
張貼留言