日野弥生:勉強しよう
LeetCode 443 - 压缩字符串
发表于2025年04月13日
本题要求原地修改字符串列表,很明显需要用到双指针。
class Solution:
def compress(self, chars: List[str]) -> int:
# 提前剪枝
length = len(chars)
if length == 0:
return 0
fast, slow, curr = 0, 0, 0
# lastExe的设计是为了快指针超出列表索引后仍然能执行一次循环
lastExe = True
while fast < length or lastExe:
if fast >= length:
lastExe = False
if lastExe and chars[fast] == chars[slow]:
fast += 1
else:
if fast - slow > 1:
chars[curr] = chars[slow]
curr += 1
# 把长度转为数字字符
numList = list(str(fast - slow))
for i in numList:
chars[curr] = i
curr += 1
slow = fast
fast += 1
else:
chars[curr] = chars[slow]
slow = fast
curr += 1
fast += 1
# 删除尾部字符
del chars[curr:]
return len(chars)
经由chat-pgt简化后的逻辑如下:
class Solution:
def compress(self, chars: List[str]) -> int:
n = len(chars)
if n == 0:
return 0
curr = 0 # 当前索引
slow = 0 # 当前字符开始的索引
fast = 0 # 快速遍历索引
while fast < n:
# 移动 fast 到当前字符的结束位置,这里的操作避免了定义lastExe,也能让最后一次执行顺利在外层while循环里完成
while fast < n and chars[fast] == chars[slow]:
fast += 1
# 填充字符
chars[curr] = chars[slow]
curr += 1
# 如果有重复的字符,添加数字
if fast - slow > 1:
for c in str(fast - slow): # 转换为字符串逐个添加
chars[curr] = c
curr += 1
# 更新 slow 为 fast(指向下一个不同字符的位置)
slow = fast
# 无需删除,只需要返回长度即可
return curr