压缩字符串 Java

压缩字符串

题目描述

在这里插入图片描述

难度:中等

解决方法

  1. 双指针

使用双指针 i 和 j ,通过记录重复字符的长度和字符信息,实时更新数组内容。具体过程是

  • 初始化指针: 使用两个指针 ij 来处理数组 charsi 表示当前需要填充的位置,j 用于遍历原始数组。

  • 遍历字符数组: 从数组的起始位置开始遍历,处理每组连续重复的字符。

  • 内循环统计连续重复字符数量:

    • 使用 tmp 记录当前字符的索引位置,然后向后移动 j 直到遇到不同的字符或者遍历结束。

    • 在内循环中,tmp 用于记录重复字符的起始索引,j 用于找到不同的字符。

  • 统计重复字符数量并进行压缩:

    • 计算重复字符的数量 count = j - tmp

    • 如果数量不为 1:

      • 将重复字符的数量转换为字符串 str = String.valueOf(count)
      • 将字符数组 chars 更新:先将重复的字符写入 chars[i],然后将重复字符的数量按照字符逐个写入 chars 中的连续位置。
  • 更新指针和数组:

    • 根据压缩后的字符数量更新指针 i,以指示下一个字符的插入位置。
  • 返回新数组的长度:

    • 返回 i,即压缩后数组的长度。
class Solution {
    public int compress(char[] chars) {
        if(chars.length<=1){
            return chars.length;
        }
        int i=0,j=0;
        while(j<chars.length){
            int tmp = j;
            chars[i] = chars[tmp];
            j++;
            while(j<chars.length && chars[tmp] == chars[j]) j++;
            int count = j-tmp;
            String str = String.valueOf(count);
            if(count!=1){
                i++;
                for(int k = 0;k<str.length();k++){
                    chars[i] = str.charAt(k);
                    i++;
                }
            }else{
                i++;
            }
        }
        return i;
    }
}
  1. 模拟

将字符数组转换为字符串,并对连续重复字符进行压缩。它使用了额外的字符串缓冲区来构建压缩后的结果,最后将其重新写回原始数组,并返回压缩后数组的长度。具体过程是

  • 初始化变量和字符缓冲区:

    • sum:用于计算连续重复字符的数量。

    • key:记录当前处理的字符。

    • sb:用于构建压缩后的字符串。

  • 遍历字符数组并压缩:

    • 从数组的第二个元素开始进行遍历。

    • 对于每个字符:

      • 如果当前字符与前一个字符相同,则增加 sum
      • 如果当前字符与前一个字符不同:
        • 将当前字符及其重复次数(如果大于1)追加到字符串 sb 中。
        • 更新 key 为当前字符,并重置 sum 为 1。
  • 处理最后一个字符及其重复次数:

    • 遍历结束后,将最后一个字符及其重复次数(如果大于1)追加到字符串 sb 中。
  • 将压缩后的字符重新写入数组:

    • 使用 sb 中的字符内容,逐个写入原始字符数组 chars
  • 返回压缩后数组的长度:

    • 返回字符串 sb 的长度,这也是压缩后数组的长度。
class Solution {
    public int compress(char[] chars) {
        if(chars.length<=1){
            return chars.length;
        }
        StringBuffer sb = new StringBuffer();
        int sum=1;
        char key = chars[0];
        sb.append(key);
        for(int i=1;i<chars.length;i++){
            if(key == chars[i]){
                sum++;
            }else{
                key = chars[i];
                if(sum!=1){
                    sb.append(String.valueOf(sum));
                }
                sb.append(key);
                sum = 1;
            }
        }
        if(sum!=1){
            sb.append(String.valueOf(sum));
        }
        for(int i=0;i<sb.length();i++){
            chars[i] = sb.charAt(i);
        }
        return sb.length();
    }
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以使用 Java 中的 GZIPOutputStream 类来压缩字符串,示例代码如下: ```java import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class GzipExample { public static void main(String[] args) throws IOException { String str = "Hello, world!"; // 待压缩字符串 // 压缩字符串 byte[] compressed = compress(str); System.out.println("Compressed: " + new String(compressed, StandardCharsets.UTF_8)); // 解压字符串 String decompressed = decompress(compressed); System.out.println("Decompressed: " + decompressed); } public static byte[] compress(String str) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try (GZIPOutputStream gzip = new GZIPOutputStream(out)) { gzip.write(str.getBytes(StandardCharsets.UTF_8)); } return out.toByteArray(); } public static String decompress(byte[] compressed) throws IOException { ByteArrayInputStream in = new ByteArrayInputStream(compressed); try (GZIPInputStream gzip = new GZIPInputStream(in)) { byte[] buffer = new byte[1024]; int len; ByteArrayOutputStream out = new ByteArrayOutputStream(); while ((len = gzip.read(buffer)) > 0) { out.write(buffer, 0, len); } return out.toString(StandardCharsets.UTF_8.name()); } } } ``` 在上述示例代码中,compress() 方法输入一个字符串,输出一个经过 GZIP 压缩后的字节数组;decompress() 方法输入一个经过 GZIP 压缩的字节数组,输出一个解压后的字符串

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值