ZeroJudge C621: Reverse this and that !!

題目敘述

題目採EOF方式收資料,每筆資料有一行由數字和字母組成的字串 (無空格)。要求輸出經過特殊排序規則後的結果,排序規則如下:

  1. 字母的部分原地反轉。
  2. 數字的部分依數字於整個字串的位置反轉。


範例輸入

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";
    }
}

留言

這個網誌中的熱門文章

ZeroJudge M933: 邏輯電路

ZeroJudge A148: You Cannot Pass?!

ZeroJudge A263: 日期差幾天