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

字符串压缩问题Python代码优化咨询:仅通过4/13测试用例

问题描述

给定一个数字字符串,若字符'c'连续出现X次,则将该连续出现的字符替换为(X,c)。

输入输出格式

  • 输入格式:单行输入目标字符串
  • 输出格式:单行输出修改后的字符串

示例

  • 输入:1222311
  • 输出:(1, 1) (3, 2) (1, 3) (2, 1)
我的实现

我编写了如下Python代码:

def pri(l):
    print(f"({l[0]}, {l[1]})",end=" ")


s = input()
lis = [1,s[0]]

for i in range(len(s)):
    fr = 1
    if i<len(s)-1:
        if s[i+1] != s[i]:
            pri(lis)
            lis = [1,s[i+1]]
        else:
            lis[0] += 1
            if s[i] == s[len(s)-1]:
                pri(lis)
                break
    else:
        lis = [1,s[i]]
        pri(lis)

但该代码仅能通过13个测试用例中的4个,请问如何优化这段代码以通过全部测试?


问题分析与优化

你的代码存在三个关键问题:

  1. 提前终止循环的错误判断:在连续字符的分支中,if s[i] == s[len(s)-1]的判断会导致当当前字符和最后一个字符相同时,提前中断计数过程,比如输入aaaa时会错误输出(2, a)而非(4, a)。
  2. 最后一个字符的重复处理:循环到最后一个字符时重新初始化lis,会覆盖之前的连续计数逻辑,存在潜在错误风险。
  3. 输出末尾多余空格:每次打印使用end=" "会导致输出字符串末尾多一个空格,不符合题目严格的格式要求。

优化后的代码

调整逻辑,持续计数连续字符,统一收集结果后再格式化输出:

s = input().strip()
if not s:
    print("")
    exit()

result = []
current_char = s[0]
count = 1

for char in s[1:]:
    if char == current_char:
        count += 1
    else:
        result.append(f"({count}, {current_char})")
        current_char = char
        count = 1
# 处理最后一组未记录的连续字符
result.append(f"({count}, {current_char})")

# 用空格拼接结果,自动避免末尾多余空格
print(" ".join(result))

代码说明

  • 先处理空字符串的边界情况,避免索引错误。
  • 初始化当前字符和计数,从第二个字符开始遍历字符串。
  • 遇到相同字符则计数累加,遇到不同字符则将当前组结果存入列表,重置计数和当前字符。
  • 遍历结束后,将最后一组连续字符的结果加入列表。
  • 用" ".join()拼接所有结果,确保输出格式符合要求,无末尾多余空格。

内容的提问来源于stack exchange,提问作者Blue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:23:20