Python实现字符串压缩时末尾字符计数差1问题排查
Python字符串压缩代码末尾计数少1问题排查
问题现象
- 字符串压缩代码其余逻辑运行正常,但输出结果中最后一组连续字符的计数始终比实际值少1
- 复现示例:输入测试用例
abcccddd时,运行输出为a1b1c3d2,正确结果应为a1b1c3d3
题目规则要求
- 实现基于连续重复字符计数的基础字符串压缩方法,例:字符串
aabcccccaaa经压缩后应得到a2b1c5a3 - 若压缩后的字符串长度不小于原字符串长度,直接返回原字符串
- 输入字符串仅包含大小写英文字母(a-z),优先实现压缩逻辑再对比长度,需避免反复拼接字符串引发的效率问题
原始问题代码
def compression(string): hash = {} list = [] count = 0 for i in range(len(string) - 1): if string[i - 1] != string[i] or i == 0: if string[i] != string[i + 1] or i == len(string) - 2: count = count + 1 list.append(str(string[i])) list.append(str(count)) count = 0 elif string[i] == string[i + 1]: count = count + 1 elif string[i - 1] == string[i]: if string[i] != string[i + 1] or i == len(string) - 2: count = count + 1 list.append(str(string[i])) list.append(str(count)) count = 0 if string[i] == string[i + 1]: count = count + 1 print(list) result = "".join(list) if len(result) == len(string): return string else: return result string = "abcccfffgggg" compression(string)
根因定位
- 循环边界错误:循环范围为
range(len(string) - 1),遍历索引最大值为len(string)-2,始终未覆盖字符串最后一个位置的字符 - 逻辑分支冗余嵌套:重复判断字符相等关系,多层分支中对最后一组字符的计数累加遗漏了最后一个字符的统计,触发写入时count值比实际少1
- 缺少收尾逻辑:循环结束后没有单独追加最后一组连续字符的统计结果,完全依赖循环内的边界判断处理末尾字符,极易出现计数偏差
- 存在无用变量:定义的
hash变量全程未使用,无意义占用内存
修正方案
- 简化判断逻辑:从第二个字符开始遍历,直接对比当前字符与前一个字符,相等则计数+1,不等则将前一个字符和对应计数写入结果列表,重置计数为1
- 补全收尾步骤:循环结束后,单独将最后一组连续字符和计数写入结果列表,彻底解决末尾字符漏统计问题
- 移除冗余变量与重复判断,使用列表拼接结果避免字符串反复拼接的性能损耗
- 最终对比压缩结果与原字符串长度,按规则返回对应值
修正后可运行代码
def compression(string): # 处理空输入边界情况 if not string: return "" res_list = [] count = 1 # 从第二个字符开始遍历,和前序字符对比 for i in range(1, len(string)): if string[i] == string[i-1]: count += 1 else: res_list.append(string[i-1]) res_list.append(str(count)) count = 1 # 追加最后一组字符的统计结果 res_list.append(string[-1]) res_list.append(str(count)) compressed = "".join(res_list) # 长度对比,不满足压缩条件返回原串 return compressed if len(compressed) < len(string) else string # 测试验证 print(compression("abcccddd")) # 输出 a1b1c3d3 print(compression("aabcccccaaa")) # 输出 a2b1c5a3 print(compression("abcccfffgggg")) # 输出 a1b1c3f3g4 print(compression("abcdef")) # 压缩后更长,返回原串 abcdef
内容的提问来源于stack exchange,提问作者ZY Cao
相关产品推荐
相关产品推荐

