Leetcode443. 压缩字符串

LeetCode 443 压缩字符串算法解析
本文详细介绍了LeetCode第443题“压缩字符串”的算法解决方案,通过原地算法实现字符数组的压缩,降低存储空间需求。文章提供了Java和Scala两种语言的代码实现,并附带示例帮助理解。

Leetcode443. 压缩字符串

题目:
给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。

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

示例2:
输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:
返回4,输入数组的前4个字符应该是:["a","b","1","2"]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。

题解:
1.设置左指针为0,返回的新长度size为0;
2.一步一步移动右指针,当右指针指向的位置的值不等于左指针指向的位置的值,或者右指针的值等于数组长度时,将左指针的值赋值给当前长度size的值,再将size值增加1;
3.如果右指针-左指针大于1时,计算右指针减去左指针的值,然后将值以字符的形式遍历存入数组size所在的位置中,再每次遍历之后将size值增加1;
4.最后将右指针的值赋值给左指针。
java代码:

public static int compress(char[] chars) {
        int left = 0;
        int size = 0;
        for (int right = 0; right <= chars.length; right++) {
            if (right == chars.length || chars[left] != chars[right]) {
                chars[size] = chars[left];
                size++;
                if (right - left > 1) {
                    String k = (right - left) + "";
                    for (char i : k.toCharArray()) {
                        chars[size] = i;
                        size++;
                    }
                }
                left = right;
            }
        }
        return size;
    }

scala代码:

/**
    * 输入:
    * ["a","a","b","b","c","c","c"]
    * 输出:
    * 返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
    *
    * @param chars
    * @return
    */
  def compress(chars: Array[Char]): Int = {
    var left = 0
    var size = 0

    for (right <- 0 to chars.length) {
      if (right == chars.length || chars(left) != chars(right)) {
        chars(size) = chars(left)
        size = size + 1
        if (right - left > 1) {
          //循环遍历的原因是可能right-left>10,这样数组中要存多个值
          val s = ((right - left) + "").toCharArray
          for (c <- s) {
            chars(size) = c
            size = size + 1
          }
        }
        left = right
      }
    }
    size
  }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值