PAT-B 1078 字串壓縮與解壓【字串】

Enjoy_process發表於2019-02-26

                                       PAT-B 1078 字串壓縮與解壓

               https://pintia.cn/problem-sets/994805260223102976/problems/994805262018265088

 

題目

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba。解壓方法就是反過來,把形如 5c 這樣的表示恢復為 ccccc。本題需要你根據壓縮或解壓的要求,對給定字串進行處理。這裡我們簡單地假設原始字串是完全由英文字母和空格組成的非空字串。

輸入

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

輸出

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

樣例輸入

C
TTTTThhiiiis isssss a   tesssst CAaaa as

樣例輸出

5T2h4is i5s a3 te4st CA3a as

分析

簡單字串處理,具體看程式。

C++程式

#include<iostream>
#include<ctype.h>
#include<string>

using namespace std;

int main()
{
	char c;
	string s;
	cin>>c;
	getchar();//讀取回車
	getline(cin,s);
	if(c=='C')//壓縮 
	{
		for(int i=0;i<s.length();)
		{
			int num=0;
			char ch=s[i];//計算有多少字元與ch一樣
			while(i<s.length()&&ch==s[i]) i++,num++;
			if(num>1) cout<<num;//數量大於1才輸出 
			cout<<ch; 
		}
	}
	else//解壓 
	{
		for(int i=0;i<s.length();)
		{
			if(isdigit(s[i]))//s[i]是數字
			{
				int j=i;
				while(i<s.length()&&isdigit(s[i])) i++;
				//計算數字的值
				int num=0;
				for(;j<i;j++)
				  num=num*10+s[j]-'0';
				for(int k=1;k<=num;k++)
				  cout<<s[i]; //輸出被壓縮的字元
				i++;//i+1為下次做準備
			}
			else
			{
				cout<<s[i];
				i++;//i+1為下次做準備
			} 
		}
	} 
	return 0; 
}

 

相關文章