【简便解法】1078 字符串压缩与解压 (20分)_42行代码AC
立志用更少的代碼做更高效的表達(dá)
Pat乙級最優(yōu)化代碼+題解+分析匯總——>傳送門
文本壓縮有很多種方法,這里我們只考慮最簡單的一種:把由相同字符組成的一個連續(xù)的片段用這個字符和片段中含有這個字符的個數(shù)來表示。例如 ccccc 就用 5c 來表示。如果字符沒有重復(fù),就原樣輸出。例如 aba 壓縮后仍然是 aba。
解壓方法就是反過來,把形如 5c 這樣的表示恢復(fù)為 ccccc。
本題需要你根據(jù)壓縮或解壓的要求,對給定字符串進(jìn)行處理。這里我們簡單地假設(shè)原始字符串是完全由英文字母和空格組成的非空字符串。
輸入格式:
輸入第一行給出一個字符,如果是 C 就表示下面的字符串需要被壓縮;如果是 D 就表示下面的字符串需要被解壓。第二行給出需要被壓縮或解壓的不超過 1000 個字符的字符串,以回車結(jié)尾。題目保證字符重復(fù)個數(shù)在整型范圍內(nèi),且輸出文件不超過 1MB。
輸出格式:
根據(jù)要求壓縮或解壓字符串,并在一行中輸出結(jié)果。
輸入樣例 1:
C
TTTTThhiiiis isssss a tesssst CAaaa as
輸出樣例 1:
5T2h4is i5s a3 te4st CA3a as
輸入樣例 2:
D
5T2h4is i5s a3 te4st CA3a as10Z
輸出樣例 2:
TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ
解析
考慮這兩個樣例:
樣例1:
C
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
樣例2:
D
123C
樣例3:
C
ABCDEFG
本題的難點(diǎn)就在于如何處理10以上的數(shù)字。
對于編碼,可以用循環(huán)查找字符出現(xiàn)的次數(shù),然后轉(zhuǎn)化成字符串賦值。
對于解碼,可以用循環(huán)查找數(shù)字的位數(shù),然后轉(zhuǎn)化成對應(yīng)數(shù)量的字符。
具體見代碼
代碼
#include<bits/stdc++.h> using namespace std; int main() {char c; cin >> c; getchar();string s, s1; getline(cin, s);if(c == 'C') {for(int i = 0; i < s.length(); i++) {char c = s[i];int num = 0;while(s[i] == c) {i++; num++;}i--; if(num > 1) {string s2; stringstream ss; ss << num;ss >> s2;s1 += s2; } s1 += c; }} else {for(int i = 0; i < s.length(); i++) {char c = s[i];if(isdigit(c)) { //如果是數(shù)字 int num = c-'0'; while(isdigit(s[i+1])) { //統(tǒng)計數(shù)字的個數(shù) i++;num = num*10+(int)(s[i]-'0');} for(int j = 0; j < num; j++) //賦值 s1 += s[i+1];i++;} else { //如果不是數(shù)字,直接加 s1 += s[i];}}}cout <<s1; return 0; }耗時
每日一句
唯有經(jīng)歷過櫛風(fēng)沐雨般的人生,方能顯得淡定從容。
總結(jié)
以上是生活随笔為你收集整理的【简便解法】1078 字符串压缩与解压 (20分)_42行代码AC的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【简便解法】1077 互评成绩计算 (2
- 下一篇: 【简便解法】1079 延迟的回文数 (2