![03c7065b179a20a8b1e016647f06c7a1.gif](https://i-blog.csdnimg.cn/blog_migrate/8770c87c3daeab155b4089ab1d22290d.gif)
? 今日习题
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为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](https://i-blog.csdnimg.cn/blog_migrate/97962686db9fb51fe7cfce1c52a5f567.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](https://i-blog.csdnimg.cn/blog_migrate/d92d8753432c9fde55fa7e7436079395.png)