切換
舊版
前往
大廳
主題

ZeroJudge - e522: 106 彰雲嘉區複賽 - Q2 跑長編碼與資料壓縮 解題心得

Not In My Back Yard | 2020-07-29 00:01:15 | 巴幣 0 | 人氣 393

題目連結:


題目大意:
第一列給定一正整數 n ,代表有 n 筆測試資料,每筆佔一列。每列給定一個字串(長度不超過 500 個字元),請將該字串按照以下方式壓縮:

請將 01 字串作連續長度編碼(Run-Length Encoding),即將連續的字元變為(字元, 出現次數)的格式。

在此將出現次數設為 3 位元長,代表可以表示的連續最長上限為長度 7 。倘若還有連續的相同字元,則變為下一部份。每個部份構成為:重複的字元佔第一位,剩下的三位即連續的長度之二進位表示法。每個部分之間以一個空白隔開。

對於每個字串,輸出壓縮後的字串以及壓縮率(在此為壓縮後與壓縮前長度之比值)。但是如果輸入的字串包含除「0」和「1」以外的字元則輸出「-1」。



範例輸入:
4
00010000000111111101111111
11111100000000000000111111111111110000
0011  1111100000101010
HINET0800000123


範例輸出:
0011 1001 0111 1111 0001 1111 92%
1110 0111 0111 1111 1111 0100 63%
-1
-1


解題思維:
用一個變數當作計數器(一開始為 0),用以計算字元連續出現的次數,並用一個布林變數代表有沒有遇過「0」和「1」以外的字元。掃過一次字串,每到一個位置看該位置的字元與前一個位置的字元是否相同且計數器之值 < 7(因為連續最長只能到 7)。

如果一樣且計數器 < 7 則將計數器 + 1 ;反之,取前一個位置的字元(代表的是計數器計算的重複字元),以及計數器之值合為一個 4 個字元長的部分。然後將該部分加進我們的編碼裡。

跑完字串後,先判斷一開始宣告的布林變數有無變更。如果有,代表有出現過非 0 、 1 的字元,則輸出「-1」;如果無,則輸出我們的編碼(記得每 4 位空一格),然後根據題意計算壓縮率。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作