【方向3】 刷题实践 | AI刷题解析之字符串解压缩

78 阅读3分钟

问题描述

小U拿到了一个通过特殊方式压缩的字符串,其中每个字母后面可能跟着一个数字,这个数字表示该字母在解压后的字符串中需要重复的次数。如果一个字母后面没有跟随数字,那么该字母在解压后的字符串中只出现一次。请帮助小U解压这个字符串并输出最终的解压结果。


测试样例

样例1:

输入:s = "a2b3c4" 输出:'aabbbcccc'

样例2:

输入:s = "d5ef2" 输出:'dddddeff'

样例3:

输入:s = "x3y1z" 输出:'xxxyz'

解题思路

要解压这个字符串,可以遍历每个字符,检查它后面是否跟有数字来确定重复次数。具体步骤:

  1. 初始化结果字符串:我们用一个空字符串来累积解压结果。

  2. 遍历字符串:遍历输入字符串的每个字符:

    • 如果当前字符是字母,则记录它作为当前字符。

    • 检查当前字符的后一个字符是否是数字:

      • 如果是数字,则读取数字,表示该字符需要重复的次数。
      • 如果不是数字,则默认重复次数为 1。
    • 将解压后的字符追加到结果字符串中。

  3. 输出解压结果:遍历完成后,返回累积的结果字符串。

代码1.0

result = []
    i = 0
    while i < len(s):
        char = s[i]
        i += 1
        
        repeat_count = 1  
        if i < len(s) and s[i].isdigit():
            repeat_count = int(s[i])
            i += 1
        
        result.append(char * repeat_count)
    
    return ''.join(result)

很不幸,没有通过测试.如下图所示:

image.png

image.png

显然不难看出,这是因为字符后面跟了一个不止一位数的数字,导致输出不符合预期.

经过AI辅组生产力代码2.0

def solution(s: str) -> str:
    result = []
    i = 0
    while i < len(s):
        # 当前字符是字母
        char = s[i]
        i += 1
        # 检查该字母后是否有数字并读取完整的数字
        repeat_count = 0
        while i < len(s) and s[i].isdigit():
            repeat_count = repeat_count * 10 + int(s[i])
            i += 1
        # 如果没有数字,默认重复次数为 1
        if repeat_count == 0:
            repeat_count = 1
        # 将字符重复 repeat_count 次后加入结果列表
        result.append(char * repeat_count)
    
    return ''.join(result)

# 测试用例
if __name__ == '__main__':
    print(solution("a2b3c4") == 'aabbbcccc')  # True
    print(solution("d5ef2") == 'dddddeff')    # True
    print(solution("x3y1z") == 'xxxyz')       # True
    print(solution("a12b0c3") == 'aaaaaaaaaaaaccc')  # True

不过这次通过的测试点多了几个,出现了新的BUG:

image.png 这次的提示报错,可以看出忽略了对与数字0的特殊处理.

自己优化了代码3.0

def solution(s: str) -> str:
    result = []
    i = 0
    while i < len(s):
        # 当前字符是字母
        char = s[i]
        i += 1
        # 检查该字母后是否有数字并读取完整的数字
        repeat_count = 0
        while i < len(s) and s[i].isdigit():
            repeat_count = repeat_count * 10 + int(s[i])
            i += 1
        # 如果没有数字,默认重复次数为 1
        if repeat_count == 0 and (i == len(s) or not s[i-1].isdigit()):
            repeat_count = 1
        # 如果重复次数不为 0,则将字符加入结果
        if repeat_count > 0:
            result.append(char * repeat_count)
    
    return ''.join(result)

# 测试用例
if __name__ == '__main__':
    print(solution("a2b3c4") == 'aabbbcccc')  # True
    print(solution("d5ef2") == 'dddddeff')    # True
    print(solution("x3y1z") == 'xxxyz')       # True

激动的心,颤抖的手,Congratulations!解答通过! image.png

总结

在解决字符串解压的问题时,AI 通过解析题目要求、帮助我设计算法步骤并指导优化过程。具体实现过程中,我的原始思路没有考虑到数字部分的多位数情况,AI 提醒我需要处理数字串的累积情况,避免出现误判。AI 推荐我使用一个 while 循环来处理数字部分,避免了手动解析每个数字字符,极大提升了代码的简洁性与效率。

最终,通过 AI 的帮助,我优化了代码并确保其能够正确处理多位数和边界条件,解决了问题并进一步理解了如何高效处理类似题目。