题目描述
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,不需要返回内容。
能否以O(1)空间解决问题?
算法
取巧
本来是在原数组上做修改,但是修改了原数组后for语句里的idx不会改变,导致错误。所以取巧在最后一步替代原数组,做到原地修改,但是使用了O(n)的额外空间。
class Solution:
def compress(self, chars: List[str]) -> int:
if not chars:return
tmp,n,ls=chars[0],1,[]
for idx,i in enumerate(chars):
if idx==0:continue
if tmp==i:n+=1
else:
if n==1:
ls+=[tmp]
tmp=i
else:
ls+=[tmp]+list(str(n))
tmp,n=i,1
ls+=[tmp]+list(str(n)) if n!=1 else [tmp]
chars[:]=ls
执行用时 :64 ms, 在所有 Python3 提交中击败了72.20%的用户
O(1)空间复杂度
class Solution:
def compress(self, chars) -> int:
if not chars:return
tmp,n,idx=chars[0],1,0
while idx<len(chars):
if idx==0:pass
elif tmp==chars[idx]:n+=1
else:
if n==1:tmp=chars[idx]
else:
t2=[tmp]+list(str(n))
chars[idx-n:idx]=t2
idx=idx-n+len(t2)
tmp, n = chars[idx], 1
idx+=1
if n!=1:chars[idx-n:idx]=[tmp]+list(str(n))
执行用时 :68 ms, 在所有 Python3 提交中击败了52.17%的用户
来源:CSDN
作者:心有泠兮。
链接:https://blog.csdn.net/Heart_for_Ling/article/details/104612276