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

题目

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

示例

示例 1:

输入:
[“a”,“a”,“b”,“b”,“c”,“c”,“c”]

输出:
返回 6 ,输入数组的前 6 个字符应该是:[“a”,“2”,“b”,“2”,“c”,“3”]

示例 2:

输入:
[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]

输出:
返回 4 ,输入数组的前4个字符应该是:[“a”,“b”,“1”,“2”]。

来源:力扣(LeetCode) 链接:
https://leetcode-cn.com/problems/string-compression

解题思路

  1. 统计出字符出现的次数
  2. 将统计出的次数数值进行拆分
  3. 按照高位到低位顺序依次将数字转换为字符

在这里插入图片描述

1、k起始值为一,当fast和slow指向的字符一样时k++,fast++;直到slow与fast不同时统计结束
2、首先将该字符放在key所指向的位置后key++;然后判断该字符出现字数是否大于一次;若大于一次该字符出现的次数由高位到低位依次转换为字符形式存储在key位置,key++;若该字符只出现一次则只需将该字符插入即可
3、slow移动到fast位置统计下个字符
注意:

代码实现

int compress(char* chars, int charsSize)
{
    if(charsSize<=1)
        return charsSize;
    int fast=0;
    int slow=0;
    int key=0;
    while(fast<charsSize)
    {
        fast++;
        int k=1;
        while(fast<charsSize&&*(chars+slow)==*(chars+fast))
        {
            fast++;
            k++;
        }//统计字符出现个数
        chars[key++]=chars[slow];
        if(k>1&&k<10)
            chars[key++]=k+'0';
        else if(k>=10&&k<100)
        {
            chars[key++]=(k/10)%10+'0';
            chars[key++]=k%10+'0';
        }
        else if(k>=100&&k<1000)
        {
            chars[key++]=(k/100)%10+'0';
            chars[key++]=(k/10)%10+'0';
            chars[key++]=k%10+'0';
        }
        else if(key==1000)
        {
            chars[key++]=(k/1000)%10+'0';
            chars[key++]=(k/100)%10+'0';
            chars[key++]=(k/10)%10+'0';
            chars[key++]=k%10+'0';
        }//将字符出现的次数由十进制数字转换为字符形式
        slow=fast;    
    }
    return key;
}

更多力扣题目代码仓库链接


版权声明:本文为qq_44768163原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。