【双指针】443. 压缩字符串

443. 压缩字符串

解题思路

  • compress 方法接受一个字符数组 chars 作为输入。这个方法将对该数组进行压缩,并返回压缩后的新长度。

  • 声明了两个指针 write 和 read,用于处理读和写操作。这是一种常见的技巧,通过使用两个指针来避免创建一个新的数组来保存压缩后的结果。

  • 外层循环使用 read 指针遍历整个字符数组,用于读取每个字符。

  • 内层循环使用 read 指针来找到连续相同字符的起始位置 readStart 和结束位置 read。

  • 然后,将第一个相同字符写入 write 指针指向的位置,并更新 write 指针。

  • 接着,如果有重复字符(即 readStart 不等于 read),则计算重复字符的数量,并将数量以字符的形式写入数组中,从而实现数字的压缩。

  • 在写数字的过程中,使用 writeStart 记录数字的起始位置,这样在写入数字时就可以按高位到低位的顺序写入。

  • 完成数字的写入后,将 read 指针移动到下一个不同的字符的位置。

  • 重复步骤 4 到步骤 8,直到遍历完整个字符数组。

  • 最后,返回 write 指针的位置,这个位置也即压缩后的新长度。

  • reverse 方法用于将字符数组中的一部分进行颠倒。这个方法用于在写入数字时将数字的顺序从个位数开始颠倒为高位到低位。

class Solution {
    public int compress(char[] chars) {
        // 双指针 本体和移除元素 这道题类似
        // 使用前后指针  计算重复的字符个数
        int fast = 0;// 读指针  遍历整个字符数组 读取每一个字符

        int slow = 0;
        // a  a b b c c c

        // 我们使用读指针找连续相同的字符的起始位置和结束 位置
        while(fast < chars.length){
            // 记录一下位置  首先记录一下连续相同字符的起始位置
            int fastStart = fast;
            // int count = 0;

            // 向前面查找字符  查找相同字符的数量
            while(fast + 1 < chars.length && chars[fast + 1] == chars[fast]){
                fast += 1;
                // count++;
            }
            // 此时慢指针指向第一个a 快指针指向第二个a

            // 首先将慢指针 也就是写指针的位置字符替换成 起始快指针的字符
            chars[slow++] = chars[fastStart];

            // 慢指针指向第二个a  那么需要将该位置替换成数字

            // 下面是记录数量
            if(fastStart != fast){
                // 终止位置 减去 起始位置  计算重复字符的数量
                int count = fast - fastStart + 1;

                // 记录写指针的起始位置
                int slowStart = slow;

                // 首先写的是个位数  
                while(count != 0){
                    chars[slow++] = (char)(count % 10 + '0');// 取余 加上字符
                    count /= 10;
                }

                // slow记录的是写指针的终止位置

                // 需要按照高位到低位来写 需要倒一下  21 -> 12
                reverse(chars,slowStart,slow -1);
            }
            fast++;
        }

        return slow;// 返回慢指针
    }

    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--;
        }
    }
}

你可能感兴趣的:(#,双指针,#,Leetcode,算法,数据结构)