You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

根因定位

  1. 循环边界错误:循环范围为range(len(string) - 1),遍历索引最大值为len(string)-2,始终未覆盖字符串最后一个位置的字符
  2. 逻辑分支冗余嵌套:重复判断字符相等关系,多层分支中对最后一组字符的计数累加遗漏了最后一个字符的统计,触发写入时count值比实际少1
  3. 缺少收尾逻辑:循环结束后没有单独追加最后一组连续字符的统计结果,完全依赖循环内的边界判断处理末尾字符,极易出现计数偏差
  4. 存在无用变量:定义的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:54:44