PAT 乙級 1078 字串壓縮與解壓

2021-09-11 09:57:29 字數 1721 閱讀 3451

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的乙個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如ccccc就用5c來表示。如果字元沒有重複,就原樣輸出。例如aba壓縮後仍然是aba

解壓方法就是反過來,把形如5c這樣的表示恢復為ccccc

本題需要你根據壓縮或解壓的要求,對給定字串進行處理。這裡我們簡單地假設原始字串是完全由英文本母和空格組成的非空字串。

輸入第一行給出乙個字元,如果是c就表示下面的字串需要被壓縮;如果是d就表示下面的字串需要被解壓。第二行給出需要被壓縮或解壓的不超過 1000 個字元的字串,以回車結尾。題目保證字元重複個數在整型範圍內,且輸出檔案不超過 1mb。

根據要求壓縮或解壓字串,並在一行中輸出結果。

c

ttttthhiiiis isssss a tesssst caaaa as

5t2h4is i5s a3 te4st ca3a as
d

5t2h4is i5s a3 te4st ca3a as10z

ttttthhiiiis isssss a   tesssst caaaa aszzzzzzzzzz
一開始的想法便是遍歷字串,之後根據c與d進行分類。

先說c,c是壓縮字元,即遍歷字串,若 碰見s[i]與s[i+1]相等,即更新計數變數,使得字元被正確地統計,統計完成後若s[i]!=s[i+1]則要將計數變數count與字元存進新的字元陣列中。輸出字元陣列時,count為1是便不必輸出。

d是釋放字元,同樣也是遍歷字串,先讀取數字,將對應的字元存入陣列中。若遇見了字元不是數字的,則停止讀取數字,將數字計算出來。同時在待輸出的字元陣列內,通過for迴圈記錄下字元。若數字為0時,即只有1個字元。將這些按要求存完後,將其輸出。

但存在較大的問題,測試點4錯誤以及測試點5段錯誤。似乎發現了一點可以改進的地方,即對於字串這一連續的讀取,不同於陣列這些間斷的讀乙個輸出乙個,而是連續讀連續輸出,所以,是否可以在乙個for迴圈內讀取字元,然後每讀取乙個或幾個便給予相應的反應(即輸出)?

在乙個for迴圈內讀取字元的想法如下,定義乙個計數的count,在for迴圈內count++,當某個字元不等於其後乙個字元時,需要停止count的增加,將count與這個字元同時輸出。如果count等於1時則不輸出。關於解壓,一開始的想法是將數字的 字元存入某個字元陣列中,後由string類函式的影響決定存放在乙個string類的字串c中,初始化為「」。若出現乙個數字字元便新增,若是字母字元,用reverse(c.begin(),c.end())函式將字串倒置。通過for迴圈讀字串,記錄下數字,最後相加得出結果。若字串c是空串,即沒有字元,計算得出的數字為0,將0賦值為1即可。

可能是重新開了乙個字串會導致記憶體超限,直接輸出可解決問題。

**如下:

#include using namespace std;

int main()

else if(b[i]<'0'||b[i]>'9')

if(sum==0)

for(j=0;jc="";}}

}//相當於解壓

return 0;

}

PAT乙級1078 字串壓縮與解壓 20

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種 把由相同字元組成的乙個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。解壓方法就是反過來,把形如 5c 這樣的表示恢復為 ccccc。本題需...

PAT乙級1078 字串壓縮與解壓 Cpp

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種 把由相同字元組成的乙個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如ccccc就用5c來表示。如果字元沒有重複,就原樣輸出。例如aba壓縮後仍然是aba。解壓方法就是反過來,把形如5c這樣的表示恢復為ccccc。本題需要你根據壓縮或解壓的...

PAT 乙級 1078 字串壓縮與解壓 20

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種 把由相同字元組成的乙個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。解壓方法就是反過來,把形如 5c 這樣的表示恢復為 ccccc。本題需...