題目敘述
題目採EOF方式收資料,每筆資料有一行由數字和字母組成的字串 (無空格)。要求輸出經過特殊排序規則後的結果,排序規則如下:
- 字母的部分原地反轉。
- 數字的部分依數字於整個字串的位置反轉。
範例輸入
123abc456de7fgh890i
FGwxjgdoCaT24txLeGkehc958KP
範例輸出
098cba765ed4hgf321i
TaCodgjxwGF85chekGeLxt942PK
解題思路
使用For迴圈和isalpha()函式一個字元一個字元進行判定。因為字母的部分是按照區塊進行排序,所以可以先宣告一個空的字串來存字母,當讀到字母時就將當前字母加到剛剛宣告的字串。如果是讀到數字的話就是確認存字母的字串是否為空,如果不是空的話就先reverse字串之後存到一個存字母陣列/Vector中,然後再將數字存到存數字的陣列/Vector中,兩邊分開處理。For迴圈結束之後使用reverse將數字的陣列做反轉,字母的不需要反轉。然後再使用一個For迴圈一樣跑輸入進來的字串做字元判定,當讀到數字時就輸出數字陣列中的第一個資料,然後就使用erase將第一個資料刪除。當讀到字母時也是將字母陣列中的第一個字串做輸出,但是在做erase之前要先把i+=alpha[0].length()-1,這樣子For迴圈下一次就會直接跳到這個連續字母的結尾的下一個資料,把i加完之後才能將字母陣列中的第一個資料做刪除。
解題程式碼如下 (僅供參考):
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
string str;
while (cin >> str)
{
vector<string>alpha;
vector<char>num;
string tmp = "";
for (int i = 0; i<str.length(); i++)
{
if (!isalpha(str[i]))
{
if (tmp != "")
{
reverse(tmp.begin(), tmp.end());
alpha.push_back(tmp);
tmp = "";
}
num.push_back(str[i]);
}
else
{
tmp += str[i];
if (i == str.length()-1)
{
reverse(tmp.begin(), tmp.end());
alpha.push_back(tmp);
}
}
}
reverse(num.begin(), num.end());
for (int i = 0; i<str.length(); i++)
{
if (!isalpha(str[i]))
{
cout << num[0];
num.erase(num.begin());
}
else
{
cout << alpha[0];
i += alpha[0].length()-1;
alpha.erase(alpha.begin());
}
}
cout << "\n";
}
}
留言
張貼留言