1. 程式人生 > >1078 字串壓縮與解壓 ——C++實現

1078 字串壓縮與解壓 ——C++實現

題目

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

演算法

顯然可以寫兩個子函式處理壓縮與解壓縮的問題。

當壓縮時,如果讀入的字元和前一個是相同的,則個數+1,反之,直接輸出讀入的字元;注意輸出的時候如果某個字元的個數為1,則不需要輸出1,字元個數大於等於2時,才需要輸出字元的數目。

使用getline()可以一次讀取整行內容。注意getline()函式的標頭檔案時<iostream>.

string s;
getline(cin,s);    //可以依次將讀取的整行內容賦給字串s

 當解壓縮時,將字元型數字需要轉化成int型數字,這裡要注意可能數字會是兩位數或者多位數,而讀取字元的時候是一個一個讀取的,因此注意都為數字的時候,要將讀取的數字*10,同時a[i]要進行++,因此可以寫成a[i++]。即:

while(a[i] <= '9' && a[i] >= '0')
			sum = sum*10 + a[i++]-'0';//數個數,有可能時兩位以上的數字

在依次迴圈輸出即可。

程式碼

#include <iostream>
#include <string>
using namespace std;
 
string a;
 
void deal1(){
	getline(cin, a);
	for(int i = 0; i < a.length(); i++)
	{
		int count = 0;
		while(a[i] == a[i+1])
			i++, count++;
		if(count != 0)	
			cout << count+1;
		cout << a[i];
	}	
}
void deal2(){
	getline(cin, a);
	for(int i = 0; i < a.length(); i++)
	{
		int sum = 0;
		while(a[i] <= '9' && a[i] >= '0')
			sum = sum*10 + a[i++]-'0';//數個數,有可能時兩位以上的數字
		for(int j = 0; j < sum; j++)
			cout << a[i];
		if(sum == 0)
			cout << a[i];
	}
}
int main(){
	char ch;
	cin >> ch;
	
	getchar();//吞回車 
	
	if(ch == 'C')
		deal1();
	else if(ch == 'D')
		deal2();
	cout << endl;
	return 0;
}