题目描述
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度。
示例
输入:
[“a”,“a”,“b”,“b”,“c”,“c”,“c”]
输出:
返回6,输入数组的前6个字符应该是:[“a”,“2”,“b”,“2”,“c”,“3”]
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。
输入:
[“a”]
输出:
返回1,输入数组的前1个字符应该是:[“a”]
输入:
[“a”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”,“b”]
输出:
返回4,输入数组的前4个字符应该是:[“a”,“b”,“1”,“2”]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。
解答
class Solution(object):
def compress(self, chars):
"""
:type chars: List[str]
:rtype: int
"""
length = len(chars)
if length==1:
return 1
# 基准字符为char[0],计数为1(它自身)
char = chars[0]
count = 1
# 从char[1]开始判断它与char[0]是否相同
i = 1
while i<length:
# 与基准字符相同,计数加一,弹出该字符
# 因为弹出了该字符,所以i已经指向了下一个,不用再加1了
if chars[i]==char:
count += 1
chars.pop(i)
length -= 1
else:
# 计数为1,不需要插入计数数量
if count==1:
char = chars[i]
count = 1
i += 1
# 计数大于1,需要插入计数数量
else:
str_count = str(count)
for num in str_count:
chars.insert(i,num)
i += 1
length += 1
# 更新基准字符
char = chars[i]
count = 1
i += 1
# 由于边遍历边弹出,最后一组字符只进行了计数和去重,没有插入计数数量
# 对最后一组字符插入计数数量
if count!=1:
str_count = str(count)
for num in str_count:
chars.insert(i,num)
i += 1
length += 1
return length