Leetcode.443——压缩字符串

前景提要

这个题目因为要求打到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#大计数器的值就是压缩部分的长
发布了5 篇原创文章 · 获赞 0 · 访问量 20

猜你喜欢

转载自blog.csdn.net/qq_42229092/article/details/104442868