【c++行程长度编码】题解与做题感想

这道题是自己肝出来的,写这篇博客主要是交流心得,希望可以帮到大家!ヾ(✿゚▽゚)ノ

问题 : 行程长度编码

时间限制: 1 Sec  内存限制: 128 MB

题目描述

在数据压缩中,一个常用的途径是行程长度压缩。对于一个待压缩的字符串而言,我们可以依次记录每个字符及重复的次数。这种压缩,对于相邻数据重复较多的情况比较有效。 例如,如果待压缩串为"AAABBBBCBB",则压缩的结果是(A,3)(B,4)(C,1)(B,2)。当然,如果相邻字符重复情况较少,则压缩效率就较低。

现要求根据输入的字符串,得到大小写不敏感压缩后的结果(即所有小写字母均视为相应的大写字母)。

输入

一个字符串,长度大于0,且不超过1000,全部由大写或小写字母组成。

输出

输出为一行,表示压缩结果,形式为:
(A,3)(B,4)(C,1)(B,2)
即每对括号内部分别为字符(都为大写)及重复出现的次数,不含任何空格。

样例输入

aAABBbBCCCaaaaa

样例输出

(A,3)(B,4)(C,3)(A,5)

这道题和字符串p型编码那道题差不多,所以输出那里我有参考 字符串p型编码那道题的题解
首先上定义
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string ss;cin>>ss;int lss=ss.size();
	int time=1,i;//次数,数组下标(要输出,所以设成全局变量)

(我开始老老实实打头文件了。。。(˘•ω•˘))

接下来转换大小写(方法就再提一遍吧:小写字母减32,大写字母加32,32是相同大写字母与小写字母的ascll码差。。。再提这一次就不提了,毕竟主要是面向我这样的新手啦)

for(i=0;i<lss;i++)
	{
		if((ss[i]<='z')&&(ss[i]>='a'))//转换成大写
			ss[i]-=32; 
	}

关键部分!

for(i=0;i<lss;i++)
	{
		if(ss[i]==ss[i+1])  
		{
			time++;
			/**///cout<<"ss"<<"["<<i<<"]"<<' '<<time<<endl;
		}
		else if(ss[i]!=ss[i+1])	
		{
			cout<<"("<<ss[i]<<","<<time<<")";/**///<<endl;
			time=1;
		}

好啦!现在来说说初始的次数,time=1的问题。

把我之前的注释都恢复,调试结果如下:


那么问题来了。。。ss[1],ss[3],ss[5],ss[6]上哪去了?!!!∑(゚Д゚ノ)ノ

回头看看程序,这里!

else if(ss[i]!=ss[i+1])	
		{
			cout<<"("<<ss[i]<<","<<time<<")";/**///<<endl;
			time=1;
		}

所以,因为循环到ss[1],ss[3],ss[5],ss[6]时,出现了ss[i]!=ss[i+1]的情况,所以这一位就用来输出了,接着程序执行下一位。也就是说,每个字符都少算了一次,因为最后一个相同的字符拿去输出而不是用于计数了,所以一开始我们就得把这位“英勇献身”的兄弟祭着!(T▽T)time=1就是这个道理

感谢你看到这里

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string ss;cin>>ss;int lss=ss.size();
	int time=1,i;//次数,数组下标(要输出,所以设成全局变量)
	for(i=0;i<lss;i++)
	{
		if((ss[i]<='z')&&(ss[i]>='a'))//转换成大写
			ss[i]-=32; 
	}

	for(i=0;i<lss;i++)
	{
		if(ss[i]==ss[i+1])  
		{
			time++;
			/**///cout<<"ss"<<"["<<i<<"]"<<' '<<time<<endl;
		}
		else if(ss[i]!=ss[i+1])	
		{
			cout<<"("<<ss[i]<<","<<time<<")";/**///<<endl;
			time=1;
		}
	} 
	return 0;
} 



猜你喜欢

转载自blog.csdn.net/JaneSilver/article/details/80928727
今日推荐