443. 压缩字符串

题目不仅需要返回数组长度,还需要返回改变后的数组,如果增加一个新数组会超过内存限制。需要用到双指针,两个用来指示相同字母的个数,还有一个来指示当前已改变数组的长度。

class Solution {
    public int compress(char[] chars) {
        int left = 0;
        int count = 0;
        int n = chars.length;
        for(int i=0;i<n;i++){
            if(i==n-1||chars[i]!=chars[i+1]){//i+1就不会超过数组范围
                chars[count++] = chars[i];
                int num = i-left + 1;
                if(num>1){
                    int flag = count;
                    while(num>0){
                        chars[count++] = (char)(num % 10+'0');//需要加两个括号
                        num = num / 10;
                    }
                    reverse(chars,flag,count-1);//对数字进行存储需要用到反转
                }
                left = i + 1;
            }

        }
        return count;
    }
    public void reverse(char[] chars,int left,int right ){
        while(left<right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;//不要忘记++和--
            right--;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值