Fiddler 抓包https的请求-PC端

Oracle体系结构学习记录

  返回  

Leetcode--Java--443. 压缩字符串

2021/8/21 13:50:51 浏览:

题目描述

给你一个字符数组 chars ,请使用下述算法压缩:

从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :

如果这一组长度为 1 ,则将字符追加到 s 中。
否则,需要向 s 追加字符,后跟这一组的长度。
压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。
请在 修改完输入数组后 ,返回该数组的新长度。
你必须设计并实现一个只使用常量额外空间的算法来解决此问题。

样例描述

示例 1:

输入:chars = ["a","a","b","b","c","c","c"]
输出:返回 6 ,输入数组的前 6 个字符应该是:["a","2","b","2","c","3"]
解释:
"aa""a2" 替代。"bb""b2" 替代。"ccc""c3" 替代。
示例 2:

输入:chars = ["a"]
输出:返回 1 ,输入数组的前 1 个字符应该是:["a"]
解释:
没有任何字符串被替代。

思路

  1. 双指针。用两个指针来搜索字符数组中所有的重复的段,并统计重复的个数,依次按规则覆盖到原来的字符数组即可。
  2. 对于重复个数如果是大于两位的数,要逐个拼接字符,需要取模得到每个个位数,由于取模得到的结果与原来相反,还要进行逆置。
  3. 注意最后返回的是修改后的字符串的长度,不是原来的长度,因此需要idx来索引当前要填入的位置,同时也记录了整个修改后的字符串的长度。

代码

class Solution {
    public int compress(char[] chars) {
        int len = chars.length;
        //记录修改后的字符串的长度,以及索引当前要填的字符位置
        int cidx = 0;
       for (int i = 0; i < len; ) {
           int j = i + 1;
           //寻找相同的段,并统计个数
           while (j < len && chars[j] == chars[j - 1]) j ++;
           int count = j - i;
           //原地修改字符串
           chars[cidx ++] = chars[i];
           //如果个数大于1,就需要拼接个数  可能有多位数 这里要用取模
           if (count > 1) {
               int l = cidx;
               while (count != 0) {
                   chars[cidx ++] = (char)(count % 10 + '0');
                   count /= 10;
               }
               //取模得到的结果是反的,要逆置
               reverse(chars, l, cidx - 1);
           }
           i = j;

       }
          return cidx;
    }
    public void reverse(char[] chars, int l, int r) {
        while (l < r) {
            char cht = chars[l];
            chars[l] = chars[r];
            chars[r] = cht;
             l ++;
             r --;
        }
    }
}

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号