華為筆試:字串解壓縮
阿新 • • 發佈:2019-01-07
將一段壓縮後的字串解壓縮,並且排序輸出
解壓規則:
每個字串後面跟隨一個數字,表示這個字串的重複次數。例如,“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; }