443. 压缩字符串

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值