前景提要
这个题目因为要求打到O(1)的复杂度,所以不能开数组,要在原有数组的基础上进行修改,然后返回新数组的长,leetcode会自动根据这个长度截出修改过的数组头部,与自己的测试用例进行对比看是否正确。
举个例子
chars=[“a”,“a”,“b”,“b”,“c”,“c”,“c”]
#压缩后得
chars=[“a”,“2”,“b”,“2”,“c”,“3”,“c”]
#可知chars前六位遭到修改,所以函数应返回6,leetcode后台会自动截取chars前六位,得到压缩体,然后进行校验。
代码实例
#
# @lc app=leetcode.cn id=443 lang=python3
#
# [443] 压缩字符串
#
# @lc code=start
class Solution:
def compress(self, chars: List[str]) -> int:
if len(chars)==1:#如果数组长度为1,可知长度为1,直接返回
return 1
flag=chars[0]#初始化标志位
counts=0#大计数器,计总长
count=0#小计数器,计算相同连续字符长度
last_count=0#count是临时变量,且最后一轮循环得不到结果,用*变量last_count承接count进行最后运算
for i in chars:#进入循环
if i != flag:#如果当前字符不等于标志字符可知出现了新字符
flag_copy=flag#将标志字符赋给临时变量flag_copy
flag=i#更新标志字符
list_count=list(str(count))#将小计数器字符串化然后列表化
if count!=1:#如果count不等于1,那么上一步形成的列表要追加到chars中
chars[counts]=flag_copy#将上一轮循环的标志字符赋值到chars
for j in list_count:#将count拆散成字符复制到chars
counts+=1
chars[counts]=j
counts+=1#大计数器前移
count=1#小计数器前移
else:#如果count等于1,则不用将其赋值到chars中,只追加上一轮循环的标志字符
chars[counts]=flag_copy
counts+=1#大计数器前移
count=1#小计数器前移
else:#如果当前字符等于标志位字符,小计数器增长
count+=1
last_count=count#将最后一轮的小计数器值保存下来,为最后一轮压缩做准备
#开始最后一轮压缩
list_count=list(str(last_count))
if last_count!=1:
chars[counts]=flag
for j in list_count:
counts+=1
chars[counts]=j
counts+=1
else:
chars[counts]=flag
counts+=1
return counts#大计数器的值就是压缩部分的长
qq_42229092
发布了5 篇原创文章 · 获赞 0 · 访问量 21
私信
关注