

可以使用双指针法(即一个写指针和一个读指针)来进行 原地压缩。算法的核心思想是:
- 遍历
chars
数组,找到连续相同的字符组。 - 写入字符 到
chars
中。 - 如果字符重复次数大于 1 ,则将计数转换为字符串并写入
chars
。 - 返回最终写入的长度。
代码实现如下:
python
def compress(chars):
write = 0 # 记录写入的位置
read = 0 # 记录读取的位置
while read < len(chars):
char = chars[read] # 当前字符
count = 0 # 记录当前字符的出现次数
# 统计当前字符的连续出现次数
while read < len(chars) and chars[read] == char:
read += 1
count += 1
# 写入字符
chars[write] = char
write += 1
# 如果 count > 1,则写入数字(拆分成单个字符)
if count > 1:
for c in str(count):
chars[write] = c
write += 1
return write # 返回新长度
示例
python
chars = ["a", "a", "b", "b", "c", "c", "c"]
new_length = compress(chars)
print(chars[:new_length]) # 输出 ['a', '2', 'b', '2', 'c', '3']
时间 & 空间复杂度
- 时间复杂度 :O(n),因为我们遍历了
chars
一次。 - 空间复杂度 :O(1),仅使用了常量额外空间(
write
和read
指针)。
这个方法可以在 原地 进行字符串压缩,并返回正确的新长度!🚀