1. 程式人生 > >華為筆試:字串解壓縮

華為筆試:字串解壓縮

將一段壓縮後的字串解壓縮,並且排序輸出

解壓規則:

每個字串後面跟隨一個數字,表示這個字串的重複次數。例如,“a5"解壓後的結果為"aaa;"abc3"解壓後的結果

為abcabcabc。

排序規則

1、根據每個字串的重複次數升序排序,然後輸入結果例如,“a3b2”,輸出的結果為“ obama

2、如果字元重複次數一樣,則根據ASC!碼順序做升序排序,然後輸出結果。

例如,“b2a2,輸出的結果為"abb

輸入描述:輸入的原始字串僅包含字母與數字

思路講解:使用hash對字串個數進行儲存,Key為字元個數,Value為字串陣列,列印字元時按key依次列印,對value中的字串陣列排序輸出即可。

按順序對輸入字串進行讀取,將字元資料存在一個字串中,當遇到數字時:

 while (str[i] >= '0'&&str[i] <= '9'&&i < len) {
                num = num * 10 + str[i] - '0';
                i++;
            }

使用num進行儲存,當出現非數字字元時,將key等於Num,value為字串陣列,如果key存在,讀取value字串陣列,將字串存入陣列,更新key,value;如果不存在就新建陣列存入hash表中。

typedef struct typen {

    vector<string> k;

}typen;
int main()
{
    string str;
    string st;
    cin >> str;
    int len = str.size();
    int i = 0;
    int num = 0;
    int flag = 0;
    map<int, typen > m;
    while(i<len)
    {
        if (str[i] >= '0'&&str[i] <= '9')
        {
            num = num * 10 + str[i] - '0';
            i++;
            while (str[i] >= '0'&&str[i] <= '9'&&i < len) {
                num = num * 10 + str[i] - '0';
                i++;
            }
            typen sss;
            if (m.find(num) == m.end())  m[num] = sss;
            else sss = m[num];
            string mm="";
            for (int j = 0; j < num; j++)
                mm += st;
            sss.k.push_back(mm);
            m[num] = sss;
            st = "";
            num = 0;
        }
        else
        {
            st.push_back(str[i++]);
        }
        
    }
    map<int, typen>::iterator iter;

    for (int i=0;i<1024;i++)
    {
        typen sk = m[i];
        sort(sk.k.begin(), sk.k.end());
        for (int i = sk.k.size()-1; i >-1; i--)
            cout << sk.k[i];
    }
    return 0;
}