天大机试复试—字符串压缩(注释超详细,小白都能看懂)

题目内容
在进行数据传输时常使用字符串压缩算法节约资源,小C CC发现在他传输的字符串中有很多连续的字符,他基于这一点创造了以下压缩方法:所有相同且连续的字符串将被压缩成“连续个数+原字符”的形式,例如字符串“A a a a B C AaaaBCAaaaBC”将被压缩为“1 A 3 a 1 B 1 C 1A3a1B1C1A3a1B1C”,字符串“111 A B 11 111AB11111AB11”将被压缩为“311 A 1 B 21 311A1B21311A1B21”。请你帮小C完成压缩程序。

输入
多组样例,第一行包含一个数字T表示样例组数。接下来每组样例占一行,保证输入字符串中只包含大小写字母、数字和空格。需要处理到输入结束(EOF)。

输出
对于每一组输入,输出压缩结果。

样例
输入

3
333 444
    ABCD
TJU 1895

输出

331 34
4 1A1B1C1D
1T1J1U1 11181915
 

提示:每个样例的字符串长度不超过10000 1000010000,所有字符串长度总和不超过1000000 10000001000000.

#include<iostream>
#include<string>
using namespace std;
int main(){
	int n;
	cin>>n;
	//输入的组数大于0才可以继续进行 
	while(n>0){
		//定义输入的字符串 
		string s;
		//cin进行输入时遇到空格代表字符串的输入结束
		//这里用getline进行字符串的输入时遇到换行符才会结束该字符串的输入
		//一次循环读取一行数据 		
		getline(cin,s);
		// 由于缓冲区可能未被刷新,可能会有换行符等,所以此时 s 为空,过滤即可
		if (s.empty()) continue;
		//读取完之后n-1代表已读完一行 
		n-=1;
		//定义输出字符串 
		string ans; 
		for(int i=0;i<s.size();++i){
			//此时i=1,j指向i的后一位 
			int j=i+1;
			//比较j所指字符和i所指是否相等 ,不相等时跳出循环 
			while(j<s.size()&&s[j]==s[i]){
				//相等j继续比较下一位 
				j+=1;				
			}
			// 统计相同字符的数量
			ans+=to_string(j-i);
			// 记录当前的字符
			ans+=s[i];
			//循环开始会++i,所以要-1				 			
			i=j-1;							
		}
		cout<<ans<<"\n";
	}
	return 0;
}

原文链接:天津大学-23年夏令营上机测试--第1题-字符串压缩_塔子哥学算法的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值