《leetcode刷题讲解》—漫漫编程路

目录

1.问题描述

2.代码及解析


1.问题描述

leetcode .面试题 .01.06.字符串压缩(难度easy,但博主觉得有相当的难度)

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

 

来源:力扣(LeetCode)
链接:面试题 01.06. 字符串压缩 - 力扣(LeetCode) (leetcode-cn.com)

2.代码及解析

int itoa(char* str, int num)//简单的一个数字转字符串函数,将转换后的数字字符串放到str空间中
{
	char tmp[5] = { 0 };
	int count = 0;
	while (num)
	{
		tmp[count++] = (num % 10) + '0';//将个位数字转换为对应数字字符放到tmp空间中(逆序的)
		num /= 10;
	}
	for (int i = 0; i < count; i++)
	{
		str[i] = tmp[count - i - 1]; //逆序将数字字符放入传入的str空间中
	}
	return count;//返回转换的数字字符串长度
}
char* compressString(char* S) {
	int len = strlen(S);
	//申请新的空间,注意空间有可能所需会变大,比如abc -> a1b1c1
	char* newstr = (char*)calloc(len, 3);
	int pos = 0;
	char* s = S;
	while (*s != '\0')
	{
		char* n = s + 1;
		while (*n != '\0' && *n == *s) n++;//走到下一个不同字符处停下
		int l = n - s;//相同字符的长度
		newstr[pos++] = *s;// 先赋值对应字符
		pos += itoa(newstr + pos, l);//将数字转为字符放在字符串中,并将数字长度返回,让新字符串的下标对准留给下一个要赋值的字符
		s = n;
	}
	return strlen(newstr) >= len ? S : newstr;
}

本题的难点在于,如何把相同字符的个数这一数字转化为字符存储在字符串中,博主尝试直接将在此函数中操作(不额外构造函数),发现非常麻烦,在这里我们要将数字从大位到小位一位一位剥离,比如说:

如果数字位152,我们就要想办法将1先剥离出来,这样的代码会非常复杂,若直接插入在此函数中让代码看起来很复杂,所以我们这里构造一个函数来实现这一目的

 接下来简单讲解一下函数的构造原理:

我们将传过来的数值逆序存储在一个数组中,有了数组我们就可以很方便的逆序访问,注意这里要将数字+‘0’才能转换为相应的数字字符。并将数字长度返回,这一返回值的用处我们下文会提到

 构造完函数之后的问题就简单起来了,我们只需要申请一个额外空间(注意这个空间应该要大于原字符串空间,因为有的字符串压缩过后长度可能反而边长,这里为了避免空间溢出,我们申请大一点的空间)。然后就是简单的遍历存字符和对应的字符个数。注意这里的pos,它是为了让新字符串下标对准下一个要赋值的字符。这样,本题就迎刃而解了。

 

 本文到此结束,感谢大家的阅读,欢迎点赞评论互关,祝大家万事如意。

评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值