1. 程式人生 > >PAT乙級 1078 字串壓縮與解壓 (20 分)

PAT乙級 1078 字串壓縮與解壓 (20 分)

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

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

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

輸入格式:

輸入第一行給出一個字元,如果是 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

思路:

第一次寫的比較繁瑣而且測試點2格式錯誤(問題出在解壓部分),於是重新寫了一遍。
壓縮時,記下當前的位置p,然後遍歷字串直至遇到不同的字元,此時相同字元的長度即為L=i-p+1,若L大於1,則輸出L,否則不輸出L,然後輸出位置p或i處的字元即可,如此直至遍歷完整個字串;
解壓時,遍歷字串,先假設相同字元的子串長度為cnt=0,如果在遇到字母之前遇到數字則cnt=10*cnt+str[i]-‘0’,如果沒有遇到數字,那麼cnt=0,然後進行相應的輸出,如此直至遍歷完整個字串。

程式碼:

#include<stdio.h>
#include<string.h>
int main(){
	char ch,str[1002];
	scanf("%c",&ch);
	getchar();
	gets(str);
	if(ch=='C'){
		for(int i=0;i<strlen(str);++i){
			int p=i;
			while(str[i]==str[i+1]) ++i;
			if(i-p+1>1) printf("%d",i-p+1);
			printf("%c",str[i]);
		}
	} 
	else{
		for(int i=0;i<strlen(str);++i){
			int cnt=0;
			while(str[i]<='9'&&str[i]>='0') cnt=cnt*10+(str[i++]-'0');
    		for(int j=0;j<cnt;j++) printf("%c",str[i]);
    		if(cnt==0) printf("%c",str[i]);
    	}
	}
	return 0;
}

在這裡插入圖片描述