字符串原地压缩

#include <cstring>
#include <iostream>
#include <utility>
using namespace std;
// 字符串翻转
void reverse(char* start, char* end)
{
	while(start < end)
	{
		swap(*start++, *end--);
	}
}
// 将数字转换成字符串存储到numStr中
// 返回被转换的数字串长度
int setNum(char* numStr, int num)
{
	if(num <= 1)
	{
		return 0;
	}
	char* p = numStr;
	while(num != 0)
	{
		*p++ = num % 10 + '0';
		num /= 10;
	}
	reverse(numStr, p - 1);
	return p - numStr;
}
// 原地压缩字符串
void compress(char str[], int len)
{
	char* compPtr = str; // 可用于存放压缩字符的地址
	char preChar = '\0';
	int sameCount = 1;
	for(int i = 0; i <= len; ++i)
	{
		if(str[i] == preChar)
		{
			++sameCount;
		}
		else
		{
			if(preChar != '\0')
			{
				*compPtr++ = preChar;
			}
			if(sameCount > 1) // 压缩连续相同长度大于1的字符串
			{
				compPtr += setNum(compPtr, sameCount);
			}
			sameCount = 1;
		}
		preChar = str[i];
	}
	*compPtr = '\0';
}
int main(int argc, char* argv[])
{
	char str[] = "kkmnqaaabbbbcdefffffffffffffffffffff";
	int len = strlen(str);
	cout << "压缩前:" << str << endl;
	compress(str, len);
	cout << "压缩后:" << str << endl;
	return 0;
}

运行结果:

压缩前:kkmnqaaabbbbcdefffffffffffffffffffff

压缩后:k2mnqa3b4cdef21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值