1078 字串壓縮與解壓(PAT B)

2021-09-26 10:38:08 字數 2883 閱讀 5183

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

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

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

輸入格式:

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

輸出格式:

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

輸入樣例 1:

cttttthhiiiis 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.思路:讀題,題目要求完成解壓或者壓縮。使用string字串來讀入,然後按照題目的要求進行壓縮或者解壓即可,重點是解決壓縮和解壓這兩個主要問題,就可以完成這個題。

2.壓縮:按照題意,壓縮主要是在重複兩次以上的字元前面加上重複的次數,因此需要乙個變數times來記錄次數。依然用老方法,遍歷字串陣列,每經過乙個元素,就將times + 1,如果當前元素和後乙個元素不同,就將times歸0,然後分類別輸出即可。(如果times > 1,就在字元前面加上次數,如果times = 1,直接輸出當前字元即可)

按照以上思路即可寫出**:

void

compress

(string str)

else cout << str[i]

;//4.如果times = 1,直接輸出當前字元

times =0;

//5.只要前後元素不同,就將times歸0,避免出現1083題中的問題}}

}

3.解壓縮:按照題意,解壓縮主要是讀取字元前面的數字,這個數字是當前字元需要重複的次數;本題有趣的乙個地方在於,這個次數是可以大於9的。同樣是老方法,遍歷陣列,如果遇到數字,就先把times計算出來,這個時候times不歸0,因為次數可能是兩位數;如果遇到字元,就先看看times的值,如果times > 1,就迴圈times次當前字元,如果沒有,就直接輸出當前字元即可。

計算times的方法如下:

在遍歷陣列前先將times歸0,如果遇到數字,就將當前字元減去『0』對應的ascii碼值以後加上times * 10。

比如:

數字為113,第一位是1,那麼times = 1 + 0 * 10 = 1,第二位是1,那麼times = 1 + 1 * 10 = 11,第三位是3,那麼times = 3 + 11 * 10 = 113。
用**寫出來如下:

for

(int i =

0; i < str.

length()

; i++

)}

得到次數times以後,按照要求輸出即可:

void

decompress

(string str)

else

}else cout << str[i]

;//如果沒有就直接輸出當前字元即可

times =0;

//記得遇到其他字元將times歸0}}

}

#include

#include

using

namespace std;

void

compress

(string str)

else cout << str[i]

; times =0;

}}}void

decompress

(string str)

else

}else cout << str[i]

; times =0;

}}}int

main()

case

'd':

}return0;

}

柳神在解壓縮部分計算次數的方法更為簡潔:直接使用string字串讀取數字,然後使用stoi函式將string字串轉換為int型數字。柳神這部分的**為:

for

(int i =

0; i < s.

length()

; i++

)else

}

附柳神的解析:1078. 字串壓縮與解壓 (20)-pat乙級真題

附柳神的**:

#include

using

namespace std;

intmain()

else}}

else

if(s.

length()

!=0)else}if

(cnt >=

2) cout << cnt;

cout << pre;

}return0;

}

PAT 乙級 1078 字串壓縮與解壓

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

1078 字串壓縮與解壓

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

1078 字串壓縮與解壓

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