刷题记录4 | 豆包MarsCode AI刷题

45 阅读3分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。


测试样例

样例1:

输入:word = "a123bc34d8ef34"
输出:3

样例2:

输入:word = "t1234c23456"
输出:2

样例3:

输入:word = "a1b01c001d4"
输出:2

解题:

def solution(word: str) -> int:
    # 将非数字字符替换为空格
    import re
    s = re.sub(r'\D', ' ', word)
    # 分割字符串,提取数字部分
    nums = s.split()
    # 使用集合存储不同的整数
    unique_nums = set()
    for num in nums:
        # 去除前导零,如果结果为空,则表示数字是'0'
        num = num.lstrip('0')
        if num == '':
            num = '0'
        unique_nums.add(num)
    # 返回不同整数的数量
    return len(unique_nums)

这道题的要求是:

  1. 将字符串 word 中的非数字字符替换为空格。
  2. 提取替换后字符串中的整数。
  3. 统计不同整数的数量,注意要忽略整数的前导零。

关键点:

  • 前导零的处理:  "01"、"001" 与 "1" 都表示相同的整数。
  • 整数的提取:  需要准确地从字符串中分离出整数部分。
  • 不同整数的统计:  使用合适的数据结构(如集合)来存储和比较。

解题思路

  1. 字符替换:

    • 使用正则表达式,将字符串中的非数字字符替换为空格。
    • 这样,原来的字母被空格替换,数字部分保留,方便后续处理。
  2. 提取整数:

    • 将替换后的字符串按照空格分割,得到一个字符串列表,每个元素都是数字字符组成的字符串。
    • 需要注意连续的数字会被保存在同一个字符串中。
  3. 处理前导零:

    • 对于每个数字字符串,使用 lstrip('0') 方法去除前导零。
    • 如果去除后字符串为空,说明原来的数字是 "0",需要特殊处理,将其设为 "0"。
  4. 统计不同的整数:

    • 使用 set 集合来存储处理后的数字字符串,自动去重。
    • 最后返回集合的大小,即不同整数的数量。

个人思考

在解这道题的过程中,需要注意以下几点:

  1. 边界条件与特殊情况:

    • 处理前导零时,如果数字全是零,需要将其表示为 "0"
    • 防止去除前导零后得到空字符串的情况。
  2. 数据结构的选择:

    • 使用集合来存储不同的整数,自动去重,简化代码逻辑。
  3. 正则表达式的应用:

    • 熟练使用正则表达式,可以简化字符串替换和匹配的操作。
  4. 字符串处理技巧:

    • 使用内置方法如 lstrip()split() 来高效地处理字符串。
  5. 测试验证的重要性:

    • 在编码完成后,使用样例进行验证,发现并纠正了代码中的错误。
  • 拓展思考:

    • 如果字符串中包含大写字母或其他特殊字符,是否需要额外处理?
    • 如果需要统计整数的总和或其他统计信息,如何修改代码?
  • 总结:

    • 这道题考察了对字符串处理、正则表达式、集合等基础知识的掌握。
    • 在处理实际问题时,细心和对边界情况的考虑是非常重要的。