把字符串存入数组c鱼鱼_【每日一题】53.压缩字符串

03c7065b179a20a8b1e016647f06c7a1.gif关注我们获取更多计算机考研信息

aad2ba4abe097b8aef19e9173df64072.png

? 今日习题

给定一组字符,使用原地算法将其压缩。

压缩后的长度必须始终小于或等于原数组长度。

数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。

在完成原地修改输入数组后,返回数组的新长度。

进阶:

你能否仅使用O(1) 空间解决问题?

示例 1:

输入:

["a","a","b","b","c","c","c"]

输出:

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

说明:

"aa" 被"a2" 替代。"bb" 被 "b2" 替代。"ccc" 被 "c3" 替代。

示例 2:

输入:

["a"]

输出:

返回 1 ,输入数组的前 1 个字符应该是:["a"]

解释:

没有任何字符串被替代。

示例 3:

输入:

["a","b","b","b","b","b","b","b","b","b","b","b","b"]

输出:

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

解释:

由于字符 "a" 不重复,所以不会被压缩。"bbbbbbbbbbbb" 被 “b12” 替代。

注意每个数字在数组中都有它自己的位置。

提示:

l  所有字符都有一个ASCII值在[35, 126]区间内。

l  1 <= len(chars) <= 1000。

d61d16f853efd1f3b0d85d64ead141ab.png

……⏰ 思考时间……

如果你想好答案了

请查看解题思路和代码实现

·解题思路·

首先设置两个变量i,j,j动,让i 找到与当前位置不同的字符。再设置一个变量k,用来控制新变化的chars的下标,因为每次均需存入原来字符。所以把nums[j]给chars[k].i-j为相同字符的个数,将个数分为3中情况,依次控制存储,注意数字与字符之间的转化。最后将i的值赋值给j,开始下一轮寻找。最后返回新数组的长度。

·代码实现·

int compress(char* chars, int charsSize) {
    int k = 0;
    for(int i = 0, j = 0; i         while(i             i++;
        }
        chars[k++] = chars[j];
        if(i - j == 1)
        {
            continue;
        }
        else if(i - j >9)
        {
            chars[k++]=(i-j)/10+'0';
            chars[k++]=(i-j)%10+'0';
            j=i;
        }
        else
        {
            chars[k++]=i-j+'0';
            j=i;
        }
    }
    return k;

·算法分析·

时间复杂度:O(n)

空间复杂度:O(1)

微信关注“字节408考研”,

免费获取各院校计算机软件考研信息与专业课资料!

40c576ea186492173ab04ce502cb4924.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值