1. 程式人生 > >(python3)1078. 字串壓縮與解壓 (20分)——2017-12考題

(python3)1078. 字串壓縮與解壓 (20分)——2017-12考題

題目贅述:

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

輸入格式:

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

輸出格式:

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

輸入樣例 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時省略數字,重點是如何使遍歷過程不重複、不遺漏,對於i 的操作尤為關鍵;

解壓的思路是找數字及其後的字元,沒有數字直接copy,難點仍是遍歷過程,且數字可能是一位數到三位數。

pro = input()
string = input()
n = len(string)
ans=""                  # 輸出結果
if pro == "C":          # 壓縮
    i = 0
    while i < n:        # 從i 開始尋找連續相同的字元,計數為con
        j = i+1
        con = 1
        while j < n and string[j]== string[i]:
            con += 1
            j += 1
        if con == 1:      # 計數為1 則直接加到ans
            ans = ans + string[i]
        else:
            new = "%d%s" % (con, string[i])
            ans = ans + new
        i = j             # i 定位到下一個字元

else:                    # 解壓
    i=0
    while i < n:
        j = i + 1
        if string[i].isdigit():            # 從i 開始尋找連續的數字字元,為數量num
            while string[j].isdigit():
                j+=1
            num = int(string[i:j])
            new = string[j] * num
            ans = ans + new
            i = j + 1
        else:                               # 若i 不為數字,直接新增到ans
            ans = ans + string[i]
            i = j
print(ans)