443. 压缩字符串
贴个题目:
贴个示例:
解题思路:
这一题主要思想就是双指针
1、left定位当前数据,然后right就往后找,如果字符与left相同,那就right就向后移动。
2、统计相同字符结束之后,更新left指针到right处,然后right要更新到left右边一个
那么根据题目要求,我们还需要index记录每一次压缩字符之后的坐标,然后复制当前正在统计的字符以及他的数量。
其中用length记录压缩后的数组长度,也就是题目中要求的返回值,其实index和length是有一个关系的,就是每一次length更新之后,index都是从length开始插入下一个字符。
然后还要特殊处理没有重复的字符,因为不重复的字符,是不需要输入数量的。
最后输入数字的时候还要注意一点,是要反转数字放进去数组里面的。
贴个代码:
int compress(char* chars, int charsSize){
if(charsSize==1) return 1;//如果数组长度为1,就返回1
int left=0;//第一个指针
int right=0;//第二个指针
int index=0;//修改数组的下标
int length=0;//返回长度
while(left<charsSize)
{
right=left+1;//更新右指针
//统计有多少个相同字符
while(right<charsSize&&chars[left]==chars[right]) right++;
int number=right-left;//记录下来多少个相同字符
if(number==1) //如果是只有单个字符
{
chars[length++]=chars[left];//就复制这个字符,并且统计字符长度
left=right;//更新左指针
continue;//下一次的循环
}
int cpynumber=number;
//统计number有多少位,预留多少位存储number
int bits=1;
while(cpynumber/=10) bits++;
index=length;//更新index
chars[index++]=chars[left];//复制当前字符
length+=(bits+1);//更新长度
//倒叙替换字符数number
while(bits--)
{
chars[index+bits]=number%10+48;
number/=10;
}
left=right;//更新左指针
}
return length;
}
性能分析:
时间分析:
这一题双指针遍历了一次数组,里面还有一下小的while循环,因此时间复杂度是:O(n)
空间分析:
新建了常数个变量,因此空间复杂度是:O(1)