题目描述
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为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”]
输出:
返回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”替代。
注意每个数字在数组中都有它自己的位置。
python解法
class Solution:
def compress(self, chars: List[str]) -> int:
i = 0
while i < len(chars):
num = 1
for j, v in enumerate(chars[i+1:], i+1):
if v == chars[i]:
num += 1
elif num != 1:
chars[i+1:j] = str(num)
i += 2
num = 0
break
else:
i += 1
num = 0
break
if num > 1:
chars[i+1:] = str(num)
break
elif num == 1:
break
return len(chars)
执行用时 : 80ms
内存消耗 : 13.8MB
题后反思:
- 我使用的是切片赋值的方法来进行原地压缩字符串。
- break不能漏,漏了可能就会出错。
C++语言解法
class Solution {
public:
int compress(vector<char>& chars) {
char str[10];
int anchor=0, writer = 0;
int len = chars.size();
for(int i=0;i<len;i++)
{
if (i+1 == len || chars[i+1] != chars[i])
{
chars[writer] = chars[anchor];
writer ++;
if (i > anchor)
{
int j = 0, num = i - anchor + 1;
while(num)
{
str[j++] = num % 10 + 48;
num /= 10;
}
for (j--;j>=0;j--)
{
chars[writer++] = str[j];
}
}
anchor = i + 1;
}
}
return writer;
}
};
执行用时 : 16ms
内存消耗 : 9.2MB
题后反思:无
文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步