[双指针] [读写指针][ 字符串/数据 压缩] 443. 压缩字符串

image
昨天面试,第一道题A的太快,结果面试官直接说这么快呀,那么来第二道。。。。。。。。。
A太快也是错。
不过这道题也A的很快。幸亏没说 再来一道

说回正题,此题的方法采用的 是帆哥的代码。我只是在他的代码上加以我的理解注释

主要思想:

  • 读指针在前面读,记录读指针开始的位置,然后记录他们之间的距离。也就是重复字符的个数
  • 写指针在后面写,写的时候还要注意,如果大于10,那么肯定取个位来获取全部的数值。那么就写反了,比如13,就写成了31
  • 因此需要在翻转一下。
  • 题目思想是比较简单的。
  • 但是要注意一下细节问题。
class Solution {
    public int compress(char[] chars) {
        int write= 0;
        int read = 0 ;
        int len = chars.length;
        while(read<len)
        {
            int readStart = read;
            // 写指针往前走,一直走到不重复的字符为止
            while(read+1<len&&chars[read+1]==chars[read])
            {
                read++;
            }
            //  ...  [readStart... read]...
            // 前面读后面写。 也就是说,aaa . a是3个,应该携程a3 ,但是写需要先写a,
            // 然后记录到底几个a,接下来的操作就是计算到底几个a
            chars[write++] = chars[readStart];
            // 如果相等,就说只有这一个字符,一个字符不用记录数量的
            if(readStart!=read)
            {
                // 记录开始点以及结束点 之间的距离
                int count = read - readStart+1;
                // 写指针开始点,写指针结束点,比如 写 a:  123
                // 1所在的位置就是开始点,3就是结束点。
                int writeStart = write;
                while(count!=0)
                {
                    // 因为如果a是13个,那么我需要先写1 ,在写3,但是我需要把整形转换为字符
                    // 因此需要这样做;
                    chars[write++] = (char)(count%10+'0');
                    count/=10;
                }
                //为什么需要这个? 因为我是13,我13写的时候先得到个位,然后得到十位,
                //写的时候就是写成了 31, 但是数据次数是13,因此需要把31重新翻转为13.
                reverse(chars,writeStart,write-1);
            }
            // a:13 写完了,需要写b了。
            read++;

        }
        return write;

    }
    public void reverse(char[] chars,int start,int end)
    {
        while(start<end)
        {
            char temp = chars[start];
            chars[start]= chars[end];
            chars[end] =temp;

            start++;
            end--;
        }
    }
}
posted @ 2022-03-20 16:48  取我方天画戟来  阅读(65)  评论(0)    收藏  举报